Необходимость прочитать только определённые строки в файле является вполне практической задачей. К примеру, однажды мне нужно было из множества однотипных HTML файлов прочитать всё, кроме заголовков. Строки в файлы были с разным содержимым и разной длинны, но шапка всегда включала одинаковое количество строк. Т.е. мне нужно было начать читать файл, к примеру, с 16й строки и считывать его до конца (последние два закрывающихся тэга </body> и </html> я просто отфильтровывал).
Часто для открытия файлов используют функцию fread(), она позволяет указывать количество считываемой информации, но для ситуации, когда строки произвольной длинны, эта функция бесполезна.
Тем не менее, задача легко решается с помощью SplFileObject::seek
$file = new SplFileObject('filename.txt'); $file->seek(1000); for($i = 0; !$file->eof() && $i < 500; $i++) { echo $file->current(); $file->next(); }
В приведённом выше коде из файла filename.txt будет считано 500 строк начиная с тысячи первой строки. Если вам нужно, чтобы файл начал считываться с тысячной строки и до конца, то код будет выглядеть так:
$file = new SplFileObject('filename.txt'); $file->seek(1000); for($i = 0; !$file->eof(); $i++) { echo $file->current(); $file->next(); }
Этот метод из интерфейса SeekableIterator не надо его путать с fseek.
И поскольку SplFileObject является итерируемым (повторяющимся), вы можете ускорить его с LimitIterator:
$file = new SplFileObject('longFile.txt'); $fileIterator = new LimitIterator($file, 1000, 2000); foreach($fileIterator as $line) { echo $line, PHP_EOL; }
Как и предыдущий пример, в этом отсчёт начинается с нуля, поэтому будут считаны строки с 1001 по 2001.
Связанные статьи:
- Изменение в директиве upload_max_filesize в php.ini на Linux не имеют эффекта (разрешение проблемы) (50%)
- Вывод в реальном времени результатов выполнения shell_exec в PHP (50%)
- Решение проблемы на PHP 7: Parse error: syntax error, unexpected T_NEW (50%)
- Поиск по нескольким строкам в PHP с функциями preg_match_all и preg_match (50%)
- PHP cURL как установить значение User Agent ИЛИ как сделать так, чтобы сервера не блокировали запросы cURL? (50%)
- Как увеличить память и время для PHP скриптов (RANDOM - 50%)