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!