Legge ogni riga del file txt nel nuovo elemento dell'array


118

Sto cercando di leggere ogni riga di un file di testo in un array e di inserire ogni riga in un nuovo elemento.
Il mio codice finora.

<?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
C'è qualcosa memorizzato nell'array con il tuo codice così com'è? Quale problema specifico stai riscontrando?
Chris Bornhoft

1
Attenzione: FALSE da fopen emetterà un avviso e darà luogo a un ciclo infinito qui. php.net/manual/en/function.feof.php
Gjermund Dahl

Nonostante la data del thread '\n\'non verrà esploso mentre deve essere un "\n"per averlo analizzato come una sequenza di escape.
codekandis

Risposte:


396

Se non hai bisogno di alcuna elaborazione speciale, questo dovrebbe fare quello che stai cercando

$lines = file($filename, FILE_IGNORE_NEW_LINES);

file()sembra essere notevolmente più lento di file_get_contents+ explodenell'array
Ron

@Ron sono d'accordo. Poi di nuovo, non dovresti leggere un file in questo modo a ogni richiesta. È semplicemente stupido, anche se la soluzione è ottimale. Il contenuto del file deve essere archiviato nella cache di memoria o anche in un database. Anche PHP memorizza il contenuto dei file analizzati. Voglio dire, siamo lontani da PHP 4.3
Yanick Rochon il

35

Il modo più veloce che ho trovato è:

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

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

dove $ nomefile sarà il percorso e il nome del tuo file, ad es. ../filename.txt.

A seconda di come hai impostato il tuo file di testo, potresti dover giocare con il \ n bit.


1
Io userei "PHP_EOL" invece di "\ n", sembra così, $ array = explode (PHP_EOL, fread ($ fp, filesize ($ filename)));
Fabian Harmsen,

Grazie Drew, dopo aver provato molte funzioni, la tua è l'unica che ha funzionato. Il mio termine di ricerca è <br> invece del tuo \ n. Il mio file veniva letto come un unico grande array di valori, l'intero testo era solo un elemento dell'array $ myarr [0], quindi il mescolamento non funzionava su un singolo elemento. Spero che aiuti qualcuno. Grazie ancora.
qui il

27

Usa questo:

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

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

FILE_IGNORE_NEW_LINESevitare di aggiungere una nuova riga alla fine di ogni elemento dell'array
Puoi anche usare FILE_SKIP_EMPTY_LINESper saltare le righe vuote

riferimento qui


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

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

fclose($file);

var_dump($members);
?>

1
Ok, funziona perfettamente grazie. Tuttavia ho bisogno di impostare un vaiable = su un elemento dell'array. $ var = $ ary [1]; non funziona. ary [1] = "test". Se questo aiuta.
Dan

1
Esegui tu stesso un contatore e imposta l'indice nell'array
Prasad

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

Ovviamente, dovrai prima creare un handle di file e archiviarlo in formato $file.


7

È semplicemente facile:

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

file_get_contents() - ottiene l'intero file come stringa.

explode("\n")- dividerà la stringa con il delimitatore "\n"- cos'è l'escape ASCII-LF per una nuova riga.

Ma fai attenzione: controlla che il file abbia terminazioni UNIX -Line.

se "\n"non funziona correttamente hai un altro codice di2 newline e puoi provare "\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

Eri sulla strada giusta, ma ci sono stati alcuni problemi con il codice che hai pubblicato. Prima di tutto, non c'erano parentesi di chiusura per il ciclo while. In secondo luogo, $ line_of_text verrebbe sovrascritto ad ogni iterazione del ciclo, che viene risolto cambiando il = in a. = Nel ciclo. Terzo, stai facendo esplodere i caratteri letterali "\ n" e non un vero ritorno a capo; in PHP, le virgolette singole denoteranno caratteri letterali, ma le virgolette doppie interpreteranno effettivamente caratteri e variabili di escape.

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

Questo accetterà il file txt come array. Quindi scrivi qualsiasi cosa nel file links.txt (usa una riga per un elemento) dopo, esegui questa pagina :) il tuo array sarà $ file


0

Questo è stato trattato abbastanza bene qui, ma se DAVVERO hai bisogno di prestazioni ancora migliori di qualsiasi cosa elencata qui, puoi usare questo approccio che usa strtok.

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

Nota, questo presuppone che il tuo file sia salvato con \nil carattere di nuova riga (puoi aggiornarlo secondo necessità) e memorizza anche le parole / nomi / linee come chiavi di matrice invece che valori, in modo che tu possa usarlo come un tabella di ricerca, che consente l'uso di isset(molto, molto più velocemente), invece di in_array.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.