# PHP fgetcsv() behavior on empty lines

The PHP documentation for fgetcsv() states that A blank line in a CSV file will be returned as an array comprising a single null field, and will not be treated as an error. Here’s a quick demonstration of this behavior.

fgetcsv.php:

<?php

while ($fields = fgetcsv(STDIN, 0, ';')) print_r($fields);

exit(0);

Execute the script and feed it some CSV with empty lines:

php -q fgetcsv.php
"Veld 1";"Veld 2";"Veld 3";;"Veld 5"

"Field 1";;"Field 3";"Field 4";
;;;;
;"Campo 2";;;"Campo 5"

After pressing Ctrl+D, I’m presented with the following output:

Array
(
[0] => Veld 1
[1] => Veld 2
[2] => Veld 3
[3] =>
[4] => Veld 5
)
Array
(
[0] =>
)
Array
(
[0] => Field 1
[1] =>
[2] => Field 3
[3] => Field 4
[4] =>
)
Array
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] =>
)
Array
(
[0] =>
[1] => Campo 2
[2] =>
[3] =>
[4] => Campo 5
)
Array
(
[0] =>
)


This behaviour on empty lines is a little bit annoying if you want to test if the line is empty():

$a = array(null); print_r($a);

if ( empty($a) ) echo '$a is empty';
else
echo '$a is not empty'; echo "\n"; This code will print: Array ( [0] => )$a is not empty


Hence, the following function:

/**
* This function tests if the given array (as returned by fgetcsv())
* is the result of an empty line in the CSV file.
*
* It does not work for lines that contain only delimiters.
* From the POV of this function, these are simply records with
* many empty fields.
*/
function fgetcsv_empty_line($row_array) { return ( !isset($row_array[1]) and empty($row_array[0]) ); } Now, if I change the call to empty() in my test to a call to fgetcsv_empty_line(): $a is empty