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
Nice work. Saved me quite a bit of debugging!
Amazing! It worked right on!