Прочитайте кожен рядок файлу 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
Dahl

Незважаючи на дату потоку, анкета '\n\'не буде вибухована, хоча це має бути, "\n"щоб її було розібрано як послідовність виходу.
codekandis

Відповіді:


397

Якщо вам не потрібна спеціальна обробка, це слід робити те, що ви шукаєте

$lines = file($filename, FILE_IGNORE_NEW_LINES);

file()здається, значно повільніше, ніж file_get_contents+ explodeдля масиву
Ron

@Ron Я згоден. Потім знову не слід читати файл таким чином при кожному запиті. Це просто нерозумно, навіть якщо рішення оптимальне. Вміст файлу повинен або зберігатися в кеш-пам'яті, або навіть у базі даних. Навіть PHP зберігає вміст проаналізованих файлів. Я маю на увазі, ми далекі від PHP 4.3
Yanick Rochon

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, розмір файлу ($ ім'я файлу)));
Фабіан Хармсен

Дякую Дрю, перепробувавши багато функцій, твій єдиний, хто працював. Мій пошуковий термін - це замість вашого \ n. Мій файл читався лише як один масив з великим значенням, весь текст був лише одним елементом масиву $ myarr [0], тому перетасування не працювало на жодному елементі. Сподіваюся, це комусь допоможе. Знову дякую.
було

27

Просто скористайтеся цим:

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

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

FILE_IGNORE_NEW_LINESуникайте додавання нового рядка в кінці кожного елемента масиву
Ви також можете використовувати FILE_SKIP_EMPTY_LINESдля пропуску порожніх рядків

посилання тут


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

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

fclose($file);

var_dump($members);
?>

1
Гаразд, це я прекрасно дякую. Однак мені потрібно встановити змінний = елемент масиву. $ var = $ ary [1]; не працює. ary [1] = "тест". Якщо це допомагає.
День

1
Запустіть лічильник самостійно і встановіть індекс у масиві
Prasad

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 втеча для нового рядка.

Але зверніть увагу - перевірте, чи має у файлі закінчення UNIX .

якщо "\n"не буде працювати належним чином, у вас є інше кодування2 нового рядка, і ви можете спробувати "\r\n", "\r"або"\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

Ви були на правильному шляху, але виникли деякі проблеми з опублікованим вами кодом. Перш за все, для циклу while не було закриваючої дужки. По-друге, $ line_of_text буде перезаписано з кожною ітерацією циклу, яка фіксується зміною циклу = на a. = По-третє, ви вибухаєте буквальні символи '\ 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);

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


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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.