Не знаю, как объяснить. Давайте рассмотрим пример. Скажем, я хочу разделить предложение
"Сегодня отличный день."
в
today today is today is a today is a great today is a great day is is a is a great is a great day a a great a great day great great day day
Идея состоит в том, чтобы получить всю последовательную комбинацию в предложении.
Я думал, что лучший способ сделать это в PHP. Любая идея приветствуется.
Вот пример:
$sentence = 'Today is a great day.'; // Only leave "word" characters and whitespace $sentence = preg_replace('/[^\w\s]+/', '', strtolower($sentence)); // Tokenize $tokens = explode(' ', $sentence); for($i = 0; $i < count($tokens); $i++) { for($j = 1; $j <= count($tokens) - $i; $j++) { echo implode(' ', array_slice($tokens, $i, $j)) . "<br />"; } }
Вывод:
today today is today is a today is a great today is a great day is is a is a great is a great day a a great a great day great great day day
разделите его на массив слов, используя функцию php-function explode. Затем используйте два вложенных цикла. Внешний (i) проходит через индикаторы массива (0..count (array) -1) и находится около первого слова в выходной строке. Внутренний цикл (j) переходит от i + 1 к длине массива. Затем во внутреннем цикле вы должны выводить слова из i в j-1. Используйте implode для этого. Используйте его в подмассиве массива слов от i до j-1. Вы можете получить его с помощью array_slice
$phrase = 'Today is a great day'; $pieces = explode(' ', strtolower($phrase)); $sets = array(); for ($i=0; $i<count($pieces);$i++) { for ($j=0; $j<count($pieces);$j++) { if ($i<=$j) $sets[$i][] = $pieces[$j]; } } print "<ul>"; foreach($sets as $set) { while(count($set) > 0) { print "<li>" . implode(' ', $set) . "</li>\n"; array_pop($set); } } print "</ul>";
Результат:
Рекурсивный подход:
function iterate($words) { if(($total = count($words)) > 0) { $str = ''; for($i = 0; $i < $total; $i++ ) { $str .= ' ' . $words[$i]; echo $str . PHP_EOL; } array_shift($words); iterate($words); } } $text = "Today is a great day."; $words = str_word_count($text, 1); iterate($words);
Вышеизложенное будет рассматривать только слова. Он не будет удалять дубликаты. Числа не являются словами, а пунктуация тоже не является. При заданном тестовом предложении из пяти слов рекурсивный подход выполняется пренебрежимо быстрее, чем решение array_splice
. Однако это значительно увеличивается с каждым дополнительным словом. Быстрый тест на моей машине с десятисловным предложением закончился почти в половине случаев.
Отказ от ответственности: изолированные тесты зависят от ряда факторов и могут давать разные результаты на разных машинах. Во всяком случае, они могут дать показатель эффективности кода (часто в области микровосстановления), но не более того.