Przeczytaj każdą linię pliku txt do nowego elementu tablicy


118

Próbuję odczytać każdy wiersz pliku tekstowego do tablicy i mieć każdy wiersz w nowym elemencie.
Jak dotąd mój kod.

<?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
Czy cokolwiek jest przechowywane w tablicy z Twoim kodem tak, jak jest? Jaki masz problem?
Chris Bornhoft

1
Ostrzeżenie: FALSE z fopen wygeneruje ostrzeżenie i spowoduje tutaj nieskończoną pętlę. php.net/manual/en/function.feof.php
Gjermund Dahl

Pomimo daty wątku '\n\'nie zostanie on eksplodowany, podczas gdy musi być a, "\n"aby został przeanalizowany jako sekwencja ucieczki.
codekandis

Odpowiedzi:


396

Jeśli nie potrzebujesz żadnego specjalnego przetwarzania, powinno to zrobić to, czego szukasz

$lines = file($filename, FILE_IGNORE_NEW_LINES);

file()wydaje się być znacznie wolniejszy niż file_get_contents+ explodedo tworzenia szyku
Ron

@Ron Zgadzam się. Z drugiej strony, nie powinieneś czytać pliku w ten sposób na każde żądanie. To po prostu głupie, nawet jeśli rozwiązanie jest optymalne. Zawartość pliku powinna być przechowywana w pamięci podręcznej lub nawet w bazie danych. Nawet PHP przechowuje zawartość przeanalizowanych plików. To znaczy, jesteśmy daleko od PHP 4.3
Yanick Rochon

35

Najszybszy sposób, jaki znalazłem, to:

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

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

gdzie $ filename będzie ścieżką i nazwą twojego pliku, np. ../filename.txt.

W zależności od tego, jak skonfigurowałeś plik tekstowy, być może będziesz musiał pobawić się \ n bitem.


1
Użyłbym "PHP_EOL" zamiast "\ n", wygląda to tak, $ array = explode (PHP_EOL, fread ($ fp, filesize ($ filename)));
Fabian Harmsen

Dzięki Drew, po wypróbowaniu wielu funkcji, Twoja jest jedyną, która działała. Moje wyszukiwane hasło to <br> zamiast twojego \ n. Mój plik był odczytywany jako pojedyncza tablica o dużej wartości, cały tekst był tylko jednym elementem tablicy $ myarr [0], więc tasowanie nie działało na pojedynczym elemencie. Mam nadzieję, że to komuś pomoże. Dzięki jeszcze raz.
washere

27

Po prostu użyj tego:

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

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

FILE_IGNORE_NEW_LINESunikaj dodawania nowej linii na końcu każdego elementu tablicy
Możesz także użyć opcji FILE_SKIP_EMPTY_LINESPomiń puste wiersze

odniesienie tutaj


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

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

fclose($file);

var_dump($members);
?>

1
Okej, mam to działające idealnie, dzięki. Jednak muszę ustawić vaiable = do elementu tablicy. $ zmienna = $ ary [1]; nie działa. ary [1] = "test". Jeśli to pomoże.
Dan

1
Uruchom licznik samodzielnie i ustaw indeks w tablicy
Prasad,

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

Oczywiście musisz najpierw utworzyć uchwyt pliku i zapisać go w $file.


7

To takie proste:

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

file_get_contents() - pobiera cały plik jako ciąg.

explode("\n")- podzieli ciąg za pomocą separatora "\n"- czym jest znak ucieczki ASCII-LF dla nowej linii.

Ale uważaj - sprawdź, czy plik ma system UNIX końcówki -Line.

jeśli "\n"nie będzie działać poprawnie, masz inne kodowanie 2 nowej linii i możesz spróbować "\r\n", "\r"lub"\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

Byłeś na dobrej drodze, ale wystąpiły problemy z opublikowanym kodem. Przede wszystkim nie było nawiasu zamykającego dla pętli while. Po drugie, $ line_of_text byłby nadpisywany przy każdej iteracji pętli, co jest naprawiane poprzez zmianę znaku = na a. = W pętli. Po trzecie, eksplodujesz dosłowne znaki „\ n”, a nie rzeczywistą nową linię; w PHP pojedyncze cudzysłowy będą oznaczać znaki dosłowne, ale podwójne cudzysłowy będą właściwie interpretować znaki ucieczki i zmienne.

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

Będzie to akceptować plik txt jako tablicę. Więc napisz cokolwiek do pliku links.txt (użyj jednej linii dla jednego elementu) po uruchomieniu tej strony :) twoja tablica będzie $ file


0

Zostało to tutaj omówione całkiem dobrze, ale jeśli NAPRAWDĘ potrzebujesz jeszcze lepszej wydajności niż cokolwiek wymienionego tutaj, możesz użyć tego podejścia, które wykorzystuje strtok.

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

Zauważ, że zakłada to, że twój plik jest zapisywany \njako znak nowego wiersza (możesz go zaktualizować w razie potrzeby), a także przechowuje słowa / nazwy / wiersze jako klucze tablicy zamiast wartości, dzięki czemu możesz go używać jako tablica przeglądowa, pozwalająca na użycie isset(dużo, dużo szybciej) zamiast in_array.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.