(PHP 4, PHP 5, PHP 7, PHP 8)
fgetcsv — Получает строку из файлового указателя и разбирает по CSV-полям
$stream
,$length
= null
,$separator
= ",",$enclosure
= "\"",$escape
= "\\"Функция похожа на функцию fgets(), за исключением того, что функция fgetcsv() анализирует строку на наличие полей в формате CSV и возвращает массив с прочитанными полями.
Замечание: Функция учитывает региональный настройки. Поэтому функция иногда неправильно разбирает данные в отдельных однобайтовых кодировках, если значение константы
LC_CTYPE
равноen_US.UTF-8
.
stream
Корректный указатель на файл, который успешно открыли функции fopen(), popen() или fsockopen().
length
Для параметра length
устанавливают значение,
которое больше самой длинной строки в CSV-файле, иначе строка разбивается на части заданной длины,
если только место разделения не встретится внутри символов-ограничителей.
Длина строк измеряется в символах с учётом символов конца строки, которыми завершаются строки.
Функция снимет ограничение на длину строки, но замедлит работу,
если параметр пропустили или начиная с PHP 8.0.0 установили для параметра значение 0 или null
.
separator
Параметр separator
устанавливает
символ-разделитель полей и принимает только один однобайтовый символ.
enclosure
Параметр enclosure
устанавливает
символ-ограничитель значения поля и принимает только один однобайтовый символ.
escape
Параметр escape
устанавливает
символ экранирования и принимает только один однобайтовый символ или пустую строку.
Пустая строка ""
отключает внутренний механизм экранирования.
Замечание: Обычно символ ограничителя значений —
enclosure
экранируется внутри поля путём удвоения; однако как альтернативу разрешается использовать символ экранированияescape
. Поэтому для стандартных значений параметра смысл значений""
и\"
одинаков. Символ экранирования —escape
не несёт отдельного смысла, кроме экранирования символа ограничителя значений —enclosure
; он даже не экранирует сам себя.
Начиная с PHP 8.4.0 полагаться на значение по умолчанию,
которое содержит параметр escape
, не рекомендуют.
Значение потребуется указать явно, позиционно
или как именованный аргумент.
Строка в CSV-формате иногда перестаёт соответствовать стандарту » RFC 4180
или не выдерживает обмена информацией с PHP-функциями
для работы с CSV-строками, если для символа экранирования escape
устанавливают значение,
которое отличается от пустой строки ""
.
Значение по умолчанию для параметра escape
— "\\"
,
поэтому рекомендуют явно указывать пустую строку. Значение по умолчанию изменят в будущей версии PHP, но не раньше PHP 9.0.
В случае успешного выполнения функция возвращает индексный массив с полями,
которые прочитала из файла, или false
, если возникла ошибка.
Замечание:
Пустую строку в CSV-файле функция возвращает как массив с единственным элементом null и не рассматривает как ошибку.
Замечание: Включение опции auto_detect_line_endings во время выполнения иногда помогает исправить неправильное распознавание языком PHP концов строк при чтении файлов на Macintosh-совместимом компьютере или файлов, которые создали на Макинтоше.
Функция выбрасывает ошибку ValueError,
если аргументы для разделителя полей separator
или ограничителя значений enclosure
содержат значение короче одного байта.
Функция выбрасывает ошибку ValueError,
если длина значения аргумента escape
не равна одному байту или передали пустую строку.
Версия | Описание |
---|---|
8.4.0 |
Вызов функции без явной передачи значения в параметр escape
устарел.
|
8.3.0 | Вместо строки с одним нулевым байтом возвращается пустая строка, если последнее поле содержит только незавершённый символ ограничения значения поля. enclosure. |
8.0.0 |
Параметр length теперь принимает значение null .
|
7.4.0 |
Параметр escape теперь также принимает пустую строку
для отключения встроенного механизма экранирования.
|
Пример #1 Пример считывания и вывода на экран содержимого CSV-файла
<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num полей в строке $row: <br /></p>\n";
$row++;
for ($c = 0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
}
}
fclose($handle);
}
?>