Lea cada línea del archivo txt en un nuevo elemento de matriz


118

Estoy tratando de leer cada línea de un archivo de texto en una matriz y tener cada línea en un nuevo elemento.
Mi código hasta ahora.

<?php
$file = fopen("members.txt", "r");
$i = 0;
while (!feof($file)) {

$line_of_text = fgets($file);
$members = explode('\n', $line_of_text);
fclose($file);

?>

1
¿Hay algo almacenado en la matriz con su código como está? ¿Qué problema específico tienes?
Chris Bornhoft

1
Advertencia: FALSE de fopen emitirá una advertencia y dará como resultado un bucle infinito aquí. php.net/manual/en/function.feof.php
Gjermund Dahl

A pesar de la fecha del hilo, '\n\'no se explotará, aunque debe ser un "\n"para analizarlo como una secuencia de escape.
codekandis

Respuestas:


397

Si no necesita ningún procesamiento especial, esto debería hacer lo que está buscando

$lines = file($filename, FILE_IGNORE_NEW_LINES);

file()parece ser considerablemente más lento que la matriz file_get_contents+explode
Ron

@Ron estoy de acuerdo. Por otra parte, no debe leer un archivo de esta manera en cada solicitud. Eso es una tontería, incluso si la solución es óptima. El contenido del archivo debe almacenarse en la memoria caché o incluso en una base de datos. Incluso PHP almacena el contenido de archivos analizados. Quiero decir, estamos lejos de PHP 4.3
Yanick Rochon

35

La forma más rápida que he encontrado es:

// Open the file
$fp = @fopen($filename, 'r'); 

// Add each line to an array
if ($fp) {
   $array = explode("\n", fread($fp, filesize($filename)));
}

donde $ filename será la ruta y el nombre de su archivo, por ejemplo. ../nombredearchivo.txt.

Dependiendo de cómo haya configurado su archivo de texto, es posible que tenga que jugar con el bit \ n.


1
Yo usaría "PHP_EOL" en lugar de "\ n", esto se ve así, $ array = explotar (PHP_EOL, fread ($ fp, ($ filename)));
Fabian Harmsen

Gracias Drew, después de probar muchas funciones, la tuya es la única que funcionó. Mi término de búsqueda es <br> en lugar de tu \ n. Mi archivo se estaba leyendo como una sola matriz de valor grande, el texto completo era solo un elemento de la matriz $ myarr [0], por lo que la reproducción aleatoria no funcionó en un solo elemento. Espero que ayude a alguien. Gracias de nuevo.
washere

27

Solo usa esto:

$array = explode("\n", file_get_contents('file.txt'));

26
$yourArray = file("pathToFile.txt", FILE_IGNORE_NEW_LINES);

FILE_IGNORE_NEW_LINESEvite agregar una nueva línea al final de cada elemento de la matriz.
También puede usar FILE_SKIP_EMPTY_LINESpara omitir líneas vacías

referencia aquí


23
<?php
$file = fopen("members.txt", "r");
$members = array();

while (!feof($file)) {
   $members[] = fgets($file);
}

fclose($file);

var_dump($members);
?>

1
Está bien, lo tengo funcionando perfectamente gracias. Sin embargo, necesito establecer un vaiable = en un elemento de matriz. $ var = $ ary [1]; No funciona. ary [1] = "prueba". Si eso ayuda.
Dan

1
Ejecute un contador usted mismo y establezca el índice en la matriz
Prasad

7
$lines = array();
while (($line = fgets($file)) !== false)
    array_push($lines, $line);

Obviamente, primero deberá crear un identificador de archivo y almacenarlo $file.


7

Es tan fácil como eso:

$lines = explode("\n", file_get_contents('foo.txt'));

file_get_contents() : obtiene el archivo completo como cadena.

explode("\n")- dividirá la cadena con el delimitador "\n"- cuál es el escape ASCII-LF para una nueva línea.

Pero preste atención: compruebe que el archivo tenga UNIX terminaciones -Line.

si "\n"no funciona correctamente, tiene otra codificación de 2 líneas nuevas y puede intentarlo "\r\n", "\r"o"\025"


3
$file = __DIR__."/file1.txt";
$f = fopen($file, "r");
$array1 = array();

while ( $line = fgets($f, 1000) )
{
    $nl = mb_strtolower($line,'UTF-8');
    $array1[] = $nl;
}

print_r($array);

1

Estabas en el camino correcto, pero hubo algunos problemas con el código que publicaste. En primer lugar, no había corchetes de cierre para el bucle while. En segundo lugar, $ line_of_text se sobrescribirá con cada iteración del bucle, que se arregla cambiando el = por a. = En el bucle. En tercer lugar, está explotando los caracteres literales '\ n' y no una nueva línea real; en PHP, las comillas simples denotarán caracteres literales, pero las comillas dobles realmente interpretarán caracteres de escape y variables.

    <?php
        $file = fopen("members.txt", "r");
        $i = 0;
        while (!feof($file)) {
            $line_of_text .= fgets($file);
        }
        $members = explode("\n", $line_of_text);
        fclose($file);
        print_r($members);
    ?>

1
    $file = file("links.txt");
print_r($file);

Esto aceptará el archivo txt como matriz. Entonces, escriba cualquier cosa en el archivo links.txt (use una línea para un elemento) después, ejecute esta página :) su matriz será $ file


0

Esto se ha cubierto aquí bastante bien, pero si REALMENTE necesita un rendimiento aún mejor que cualquiera de los enumerados aquí, puede usar este enfoque que usa strtok.

$Names_Keys = [];
$Name = strtok(file_get_contents($file), "\n");
while ($Name !== false) {
    $Names_Keys[$Name] = 0;
    $Name = strtok("\n");
}

Tenga en cuenta que esto supone que su archivo se guarda con \nel carácter de nueva línea (puede actualizarlo según sea necesario), y también almacena las palabras / nombres / líneas como claves de matriz en lugar de los valores, para que pueda usarlo como un tabla de búsqueda, lo que permite el uso de isset(mucho, mucho más rápido), en lugar de in_array.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.