Прочитать каждую строку txt файла в новый элемент массива

118

Я пытаюсь прочитать каждую строку текстового файла в массиве и поместить каждую строку в новый элемент.
Мой код пока что.

<?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
Сохраняется ли что-нибудь в массиве с вашим кодом как есть? Какая у вас конкретная проблема?
Крис Борнхофт
1
Предупреждение: FALSE от fopen выдаст предупреждение и приведет к бесконечному циклу здесь. php.net/manual/en/function.feof.php
Даль
Несмотря на дату потока, an '\n\'не будет взорван, хотя он должен быть a, "\n"чтобы он был проанализирован как escape-последовательность.
codekandis

Ответы:

396

Если вам не нужна специальная обработка, это должно сделать то, что вы ищете.

$lines = file($filename, FILE_IGNORE_NEW_LINES);
Яник Рочон
источник
file()кажется значительно медленнее, чем file_get_contents+ explodeto array
Рон
@ Рон Я согласен. Опять же, вы не должны читать файл таким образом при каждом запросе. Это просто глупо, даже если решение оптимальное. Содержимое файла должно храниться в кеше памяти или даже в базе данных. Даже PHP хранит содержимое проанализированных файлов. Я имею в виду, что мы далеки от PHP 4.3
Яник Рочон
35

Самый быстрый способ, который я нашел:

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

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

где $ filename будет путем и именем вашего файла, например. ../filename.txt.

В зависимости от того, как вы настроили текстовый файл, вам, возможно, придется поиграться с битом \ n.

Дрю Делло Стритто
источник
1
Я бы использовал «PHP_EOL» вместо «\ n», это выглядит так, $ array = explode (PHP_EOL, fread ($ fp, sizes ($ filename)));
Фабиан Хармсен
Спасибо, Дрю, попробовав много функций, у тебя сработала только одна. Мой поисковый запрос - <br> вместо вашего \ n. Мой файл читался только как один большой массив значений, весь текст представлял собой только один элемент массива $ myarr [0], поэтому перемешивание не работало с одним элементом. Надеюсь, это кому-то поможет. Еще раз спасибо.
washere
27

Просто используйте это:

$array = explode("\n", file_get_contents('file.txt'));
RoLife
источник
26
$yourArray = file("pathToFile.txt", FILE_IGNORE_NEW_LINES);

FILE_IGNORE_NEW_LINESИзбегайте добавления новой строки в конце каждого элемента массива.
Вы также можете использовать FILE_SKIP_EMPTY_LINESдля пропуска пустых строк.

ссылка здесь

iianfumenchu
источник
23
<?php
$file = fopen("members.txt", "r");
$members = array();

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

fclose($file);

var_dump($members);
?>
Gaurav
источник
1
Хорошо, у меня все работает отлично, спасибо. Однако мне нужно установить vaiable = для элемента массива. $ var = $ ary [1]; не работает. ary [1] = "тест". Если это поможет.
Дэн
1
Самостоятельно запустите счетчик и установите индекс в массиве
Прасад
7
$lines = array();
while (($line = fgets($file)) !== false)
    array_push($lines, $line);

Очевидно, вам нужно сначала создать дескриптор файла и сохранить его в $file.

Рэйф Кеттлер
источник
7

Это просто:

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

file_get_contents() - получает весь файл в виде строки.

explode("\n")- разделит строку разделителем "\n"- что такое ASCII-LF escape для новой строки.

Но обратите внимание - убедитесь, что у файла есть UNIX -строчные окончания.

если "\n"не будет работать должным образом, у вас есть другая кодировка 2 новой строки, и вы можете попробовать "\r\n", "\r"или"\025"

CodeBrauer
источник
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

Вы были на правильном пути, но с опубликованным вами кодом возникли некоторые проблемы. Во-первых, для цикла while не было закрывающей скобки. Во-вторых, $ line_of_text будет перезаписываться при каждой итерации цикла, что фиксируется изменением = на. = В цикле. В-третьих, вы расставляете буквальные символы '\ n', а не новую строку; в PHP одинарные кавычки обозначают буквальные символы, но двойные кавычки фактически интерпретируют экранированные символы и переменные.

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

Это будет принимать текстовый файл как массив. Так что напишите что-нибудь в файл links.txt (используйте одну строку для одного элемента) после того, как запустите эту страницу :) ваш массив будет $ file

altayevrim
источник
0

Здесь это описано достаточно хорошо, но если вы ДЕЙСТВИТЕЛЬНО нужна даже лучшая производительность, чем все перечисленное здесь, вы можете использовать этот подход, который использует strtok.

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

Обратите внимание, это предполагает, что ваш файл сохранен с \nсимволом новой строки (вы можете обновить его по мере необходимости), и он также сохраняет слова / имена / строки как ключи массива вместо значений, так что вы можете использовать его как таблица поиска, позволяющая использовать isset(намного, намного быстрее) вместо in_array.

Брайан Лейшман
источник