Итерирование файлов

July 26, 2026 · View on GitHub

Вернуться к главной странице

Инструменты для итерирования по содержимому файлов.


Read CSV

Итерирует коллекции ячеек CSV-файла построчно.

File::readCsv(resource $fileHandle, string $separator = ',', string $enclosure = '"', string $escape = '\\')

use IterTools\File;
$fileHandle = \fopen('path/to/file.csv', 'r');
foreach (File::readCsv($fileHandle) as $row) {
    print_r($row);
}
// Каждое поле столбца — элемент массива

Read CSV Assoc

Итерирует строки CSV-файла как ассоциативные массивы с ключами из заголовков.

File::readCsvAssoc(resource $fileHandle, ?array $headers = null, string $separator = ',', string $enclosure = '"', string $escape = '\\')

Если $headers равен null, первая строка файла потребляется и используется как список заголовков. Иначе используются переданные $headers, а каждая строка считается данными.

Заголовки (вычисленные или переданные) проверяются до выдачи данных: каждый заголовок должен быть непустой строкой, а список — уникальным. Строка данных, число полей которой отличается от числа заголовков, выбрасывает \RuntimeException с указанием 1-индексированного номера строки данных (пустые строки fgetcsv возвращает как одно поле, поэтому они также вызывают эту ошибку, а не пропускаются молча). Единственное исключение — файл с одним столбцом: там пустую строку нельзя отличить от пустого поля, поэтому она выдаётся как строка со значением null, а не вызывает ошибку.

Заголовки — строки, но ключи массивов в PHP канонизируются: заголовок, являющийся канонической целочисленной строкой ("1", "2020"), становится целочисленным ключом в выдаваемых строках, поэтому строка имеет тип array<int|string, string|null>. Это преобразование инъективно на канонических формах — заголовки, лишь похожие на числа ("01", "1.0", " 1", "+1", числа больше PHP_INT_MAX), остаются строковыми ключами, — поэтому ни один столбец не может быть потерян из-за совпадения ключей, а неоднозначные случаи уже отсекает проверка на дубликаты заголовков.

use IterTools\File;
$fileHandle = \fopen('path/to/file.csv', 'r');
foreach (File::readCsvAssoc($fileHandle) as $row) {
    print_r($row);
}
// ['header1' => 'value1', 'header2' => 'value2', ...]

Read Lines

Итерирует содержимое файла построчно.

File::readLines(resource $fileHandle)

use IterTools\File;
$fileHandle = \fopen('path/to/file.txt', 'r');
foreach (File::readLines($fileHandle) as $line) {
    print($line);
}

Write CSV

Записывает коллекцию строк в файл в формате CSV.

File::writeCsv(resource $fileHandle, iterable $rows, ?array $header = null, string $separator = ',', string $enclosure = '"', string $escape = '\\')

Если $header не равен null, он записывается как первая строка перед строками данных. Каждая строка должна быть массивом скаляров.

use IterTools\File;
$fileHandle = \fopen('path/to/file.csv', 'w');
$rows       = [
    ['1', 'The Phantom Menace', '1999'],
    ['2', 'Attack of the Clones', '2002'],
];
File::writeCsv($fileHandle, $rows, ['episode', 'title', 'year']);

Write Lines

Записывает коллекцию строк в файл.

File::writeLines(resource $fileHandle, iterable $lines, string $lineSeparator = \PHP_EOL)

Разделитель $lineSeparator вставляется между строками, но не после последней строки. Пустая коллекция ничего не записывает.

use IterTools\File;
$fileHandle = \fopen('path/to/file.txt', 'w');
$lines      = ['The quick', 'brown fox', 'jumps over'];
File::writeLines($fileHandle, $lines);