algoritmo de división de frases en PHP

No estoy seguro de cómo explicarlo. Usemos un ejemplo. Digamos que quiero dividir la oración

“Hoy es un gran día.”

dentro

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 

La idea es obtener toda la combinación secuencial en una oración.

He estado pensando cuál es la mejor manera de hacerlo en PHP. Cualquier idea es bienvenida.

Aquí hay un ejemplo:

 $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)) . "
"; } }

Salida:

 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 

divídalo en una matriz de palabras usando la explosión de la función php. Luego usa dos bucles nesteds. El exterior (i) pasa por los indicadores de matriz (0..count (matriz) -1) y es aproximadamente la primera palabra en la línea de salida. El bucle interno (j) va de i + 1 a la longitud de la matriz. Luego, dentro del ciclo interno, debe generar las palabras de i a j-1. Use Implode para hacer eso. Úselo en una submatriz de la matriz de palabras de i a j-1. Puedes obtenerlo usando array_slice

 $phrase = 'Today is a great day'; $pieces = explode(' ', strtolower($phrase)); $sets = array(); for ($i=0; $i"; foreach($sets as $set) { while(count($set) > 0) { print "
  • " . implode(' ', $set) . "
  • \n"; array_pop($set); } } print "";

    Resultado:

    • Hoy es un gran día
    • hoy es un gran
    • hoy es un
    • hoy es
    • hoy
    • es un gran día
    • es genial
    • es un
    • es
    • un gran día
    • un gran
    • un
    • gran día
    • estupendo
    • día

    Enfoque recursivo:

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

    Lo anterior solo considerará las palabras. No eliminará duplicados. Los números no son palabras y la puntuación tampoco. Con la oración de prueba dada de cinco palabras, el enfoque recursivo se realiza de manera array_splice más rápida que la solución array_splice . Sin embargo, esto aumenta significativamente con cada palabra adicional. Un punto de referencia rápido en mi máquina con una oración de diez palabras terminó en casi la mitad del tiempo.


    Descargo de responsabilidad: Los puntos de referencia aislados dependen de una serie de factores y pueden producir resultados diferentes en diferentes máquinas. En todo caso, pueden dar un indicador sobre el rendimiento del código (a menudo en el ámbito de las micro-optimizaciones), pero nada más.