Lea las líneas del archivo al revés (fgets) con php

Tengo un archivo txt que quiero leer al revés, actualmente estoy usando esto:

$fh = fopen('myfile.txt','r'); while ($line = fgets($fh)) { echo $line."
"; }

Esto produce todas las líneas en mi archivo.
Quiero leer las líneas de abajo hacia arriba.

¿Hay una manera de hacerlo?

Primera forma:

 $file = file("test.txt"); $file = array_reverse($file); foreach($file as $f){ echo $f."
"; }

Second Way (a):

Para invertir completamente un archivo:

 $ fl = fopen ("\ some_file.txt", "r");
 for ($ x_pos = 0, $ output = ''; fseek ($ fl, $ x_pos, SEEK_END)! == -1; $ x_pos--) {
     $ output. = fgetc ($ fl);
     }
 fclose ($ fl);
 print_r ($ salida);

Second Way (b): por supuesto, querías inversión línea por línea …

 $ fl = fopen ("\ some_file.txt", "r");
 for ($ x_pos = 0, $ ln = 0, $ output = array (); fseek ($ fl, $ x_pos, SEEK_END)! == -1; $ x_pos--) {
     $ char = fgetc ($ fl);
     if ($ char === "\ n") {
         // analiza la línea completa $ output [$ ln] si es necesario
         $ ln ++;
         continuar;
         }
     $ salida [$ ln] = $ char.  ((array_key_exists ($ ln, $ output))? $ output [$ ln]: '');
     }
 fclose ($ fl);
 print_r ($ salida);

Pruebe algo más simple como este ..

 print_r(array_reverse(file('myfile.txt'))); 

Aquí está mi solución para imprimir el archivo al revés. Es bastante amigable con la memoria . Y parece más legible (IMO [= en mi opinión]).

Pasa el archivo hacia atrás, cuenta los caracteres hasta el comienzo de una línea o el inicio del archivo y luego lee e imprime esa cantidad de caracteres como una línea, luego mueve el cursor hacia atrás y lee otra línea como esa …

  if( $v = @fopen("PATH_TO_YOUR_FILE", 'r') ){ //open the file fseek($v, 0, SEEK_END); //move cursor to the end of the file /* help functions: */ //moves cursor one step back if can - returns true, if can't - returns false function moveOneStepBack( &$f ){ if( ftell($f) > 0 ){ fseek($f, -1, SEEK_CUR); return true; } else return false; } //reads $length chars but moves cursor back where it was before reading function readNotSeek( &$f, $length ){ $r = fread($f, $length); fseek($f, -$length, SEEK_CUR); return $r; } /* THE READING+PRINTING ITSELF: */ while( ftell($v) > 0 ){ //while there is at least 1 character to read $newLine = false; $charCounter = 0; //line counting while( !$newLine && moveOneStepBack( $v ) ){ //not start of a line / the file if( readNotSeek($v, 1) == "\n" ) $newLine = true; $charCounter++; } //line reading / printing if( $charCounter>1 ){ //if there was anything on the line if( !$newLine ) echo "\n"; //prints missing "\n" before last *printed* line echo readNotSeek( $v, $charCounter ); //prints current line } } fclose( $v ); //close the file, because we are well-behaved } 

Por supuesto, reemplace PATH_TO_YOUR_FILE con su propia ruta a su archivo, @ se usa al abrir el archivo, porque cuando el archivo no se encuentra o no se puede abrir, se genera una advertencia, si desea mostrar esta advertencia, simplemente elimine el error. supresor ‘@’.

Si el archivo no es tan grande, puede usar file() :

 $lines = file($file); for($i = count($lines) -1; $i >= 0; $i--){ echo $lines[$i] . '
'; }

Sin embargo, esto requiere que todo el archivo esté en la memoria, por eso no es adecuado para archivos realmente grandes.