Lesen Sie jede Zeile der txt-Datei in ein neues Array-Element


116

Ich versuche, jede Zeile einer Textdatei in ein Array einzulesen und jede Zeile in einem neuen Element zu haben.
Mein Code bisher.

<?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
Ist irgendetwas im Array mit Ihrem Code so gespeichert, wie er ist? Welches spezifische Problem haben Sie?
Chris Bornhoft

1
Warnung: FALSE von fopen gibt eine Warnung aus und führt hier zu einer Endlosschleife. php.net/manual/en/function.feof.php
Gjermund Dahl

Trotz des Datums des Threads '\n\'wird ein nicht explodiert, während es ein sein muss "\n", damit es als Escape-Sequenz analysiert wird.
Codekandis

Antworten:


396

Wenn Sie keine spezielle Verarbeitung benötigen, dies tun sollten , was Sie suchen

$lines = file($filename, FILE_IGNORE_NEW_LINES);

file()scheint erheblich langsamer zu sein als file_get_contents+ explodezu Array
Ron

@ Ron Ich stimme zu. Andererseits sollten Sie eine Datei nicht bei jeder Anforderung auf diese Weise lesen. Das ist einfach albern, auch wenn die Lösung optimal ist. Der Inhalt der Datei sollte entweder im Speichercache oder sogar in einer Datenbank gespeichert werden. Sogar PHP speichert den Inhalt von analysierten Dateien. Ich meine, wir sind weit von PHP 4.3 entfernt
Yanick Rochon

35

Der schnellste Weg, den ich gefunden habe, ist:

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

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

Dabei wird $ filename der Pfad und der Name Ihrer Datei sein, z. ../filename.txt.

Je nachdem, wie Sie Ihre Textdatei eingerichtet haben, müssen Sie möglicherweise mit dem \ n-Bit herumspielen.


1
Ich würde "PHP_EOL" anstelle von "\ n" verwenden, dies sieht so aus, $ array = explode (PHP_EOL, fread ($ fp, Dateigröße ($ Dateiname));
Fabian Harmsen

Vielen Dank, Drew, nachdem Sie viele Funktionen ausprobiert haben, ist Ihre die einzige, die funktioniert hat. Mein Suchbegriff ist <br> anstelle Ihres \ n. Meine Datei wurde nur als einzelnes Array mit großem Wert gelesen, der gesamte Text war nur ein Array-Element $ myarr [0], sodass das Mischen für ein einzelnes Element nicht funktionierte. Hoffe es hilft jemandem. Danke noch einmal.
Washere

26

Verwenden Sie einfach dies:

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

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

FILE_IGNORE_NEW_LINESVermeiden Sie das Hinzufügen von Zeilenumbrüchen am Ende jedes Array-Elements.
Sie können auch FILE_SKIP_EMPTY_LINESleere Zeilen überspringen

Referenz hier


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

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

fclose($file);

var_dump($members);
?>

1
Okay, ich habe es perfekt funktioniert, danke. Ich muss jedoch ein vaiable = auf ein Array-Element setzen. $ var = $ ary [1]; funktioniert nicht. ary [1] = "test". Wenn das hilft.
Dan

1
Führen Sie selbst einen Zähler aus und setzen Sie den Index im Array
Prasad

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

Natürlich müssen Sie zuerst ein Dateihandle erstellen und darin speichern $file.


7

So einfach ist das:

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

file_get_contents() - Ruft die gesamte Datei als Zeichenfolge ab.

explode("\n")- teilt die Zeichenfolge mit dem Trennzeichen "\n"- was ist ASCII-LF-Escape für eine neue Zeile?

Aber pass auf - überprüfe, ob die Datei UNIX hat Line-Endungen hat.

Wenn dies "\n"nicht richtig funktioniert, haben Sie eine andere Codierung von 2 Zeilenumbruch und können versuchen "\r\n", "\r"oder"\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

Sie waren auf dem richtigen Weg, aber es gab einige Probleme mit dem von Ihnen geposteten Code. Erstens gab es keine schließende Klammer für die while-Schleife. Zweitens würde $ line_of_text bei jeder Schleifeniteration überschrieben, was durch Ändern von = in a. = In der Schleife behoben wird. Drittens explodieren Sie die wörtlichen Zeichen '\ n' und keine tatsächliche neue Zeile. In PHP bezeichnen einfache Anführungszeichen Literalzeichen, aber doppelte Anführungszeichen interpretieren tatsächlich maskierte Zeichen und Variablen.

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

Dies akzeptiert die txt-Datei als Array. Schreiben Sie also etwas in die Datei links.txt (verwenden Sie eine Zeile für ein Element), nachdem Sie diese Seite ausgeführt haben :) Ihr Array wird $ file sein


0

Dies wurde hier recht gut behandelt, aber wenn Sie WIRKLICH eine noch bessere Leistung benötigen als alles, was hier aufgeführt ist, können Sie diesen Ansatz verwenden strtok.

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

Beachten Sie, dass dies voraussetzt, dass Ihre Datei mit \ndem Zeilenumbruchzeichen gespeichert ist (Sie können dies nach Bedarf aktualisieren), und dass die Wörter / Namen / Zeilen anstelle der Werte als Array-Schlüssel gespeichert werden, sodass Sie sie als verwenden können Nachschlagetabelle, die die Verwendung von isset(viel, viel schneller) anstelle von ermöglicht in_array.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.