Intereting Posts
Как рассчитать интервал между 2 временными метками unix в php БЕЗ деления на 86400 (60 * 60 * 24) Не удалось установить соединение Swift_TransportException с узлом smtp.gmail.com Изображения php rss показывают изображения Как создать вложенный массив из массива в PHP PHP перенаправляет обратно на предыдущую страницу while ($ row = mysql_fetch_array ($ result)) – сколько циклов выполняется? mysqli_rollback ($ con) не работает как сохранить сеанс активным, даже я открылся на нескольких вкладках в одном браузере PHP: как добавить случайный символ в строку в случайном положении Как использовать мыло в javascript PHPExcel: ошибка «Невозможно прочитать файл» Преобразование Excel в PDF (.xlsx в .pdf) Размещение папки приложения PHP над public_html Нужна помощь по настройке значения в php Как экспортировать строку Base64 в файл на стороне сервера, не сохраняя его на веб-сервере, напрямую с помощью PHP? Идентификатор SyntaxError: начинается сразу после числового литерала. Передача переменной PHP в JavaScript

алгоритм разделения фразы в PHP

Не знаю, как объяснить. Давайте рассмотрим пример. Скажем, я хочу разделить предложение

"Сегодня отличный день."

в

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>"; 

Результат:

  • Сегодня отличный день
  • сегодня большой
  • сегодня является
  • сегодня
  • Cегодня
  • большой день
  • является великим
  • это
  • является
  • большой день
  • Великий
  • отличный день
  • Великий
  • день

Рекурсивный подход:

 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 . Однако это значительно увеличивается с каждым дополнительным словом. Быстрый тест на моей машине с десятисловным предложением закончился почти в половине случаев.


Отказ от ответственности: изолированные тесты зависят от ряда факторов и могут давать разные результаты на разных машинах. Во всяком случае, они могут дать показатель эффективности кода (часто в области микровосстановления), но не более того.