Cómo hacer eco de una línea aleatoria desde un archivo de texto

Mi formato de archivo de texto es:

Esta es la primera línea.
Esta es la segunda línea.
Esta es la tercera línea.

Podría haber más líneas en el archivo de texto. Cómo hacer eco de una línea aleatoria en cada actualización del archivo de texto con php. Todos los comentarios son apreciados. Gracias

Solutions Collecting From Web of "Cómo hacer eco de una línea aleatoria desde un archivo de texto"

Un enfoque generalmente bueno para este tipo de situación es:

  1. Lee las líneas en una matriz usando el file()
  2. echo un valor de matriz aleatorio usando array_rand()

Tu código podría verse más o menos así:

 $lines = file('my_file.txt'); echo $lines[array_rand($lines)]; 

¿Qué tan grande de un archivo estamos hablando? El enfoque sencillo es cargar todo el archivo en la memoria como una matriz de cadenas y seleccionar un índice de matriz aleatoria de 0 a N y mostrar esa línea.

Si el tamaño del archivo puede ser realmente grande, entonces tendría que implementar algún tipo de solución de transmisión.

¡Solución de streaming explicada!

La siguiente solución producirá una línea aleatoria distribuida uniformemente desde un archivo relativamente grande con un tamaño de línea máximo ajustable por archivo.

 < ?php function rand_line($fileName, $maxLineLength = 4096) { $handle = @fopen($fileName, "r"); if ($handle) { $random_line = null; $line = null; $count = 0; while (($line = fgets($handle, $maxLineLength)) !== false) { $count++; // P(1/$count) probability of picking current line as random line if(rand() % $count == 0) { $random_line = $line; } } if (!feof($handle)) { echo "Error: unexpected fgets() fail\n"; fclose($handle); return null; } else { fclose($handle); } return $random_line; } } // usage echo rand_line("myfile.txt"); ?> 

Digamos que el archivo tiene 10 líneas, la probabilidad de elegir la línea X es:

  • P (1) = 1
  • P (2) = 1/2 * P(1)
  • P (3) = 2/3 * P(2)
  • P (N) = (N-1)/N * P(N-1) = 1/N

Lo que finalmente nos dará una línea aleatoria distribuida uniformemente desde un archivo de cualquier tamaño sin leer el archivo completo en la memoria.

Espero que ayude