There are a few ways to read CSV files with PHP. I used to use the explode function to put each line into an array and then explode commas and use trim
This converts the CSV into a nested array. Might be easier for you to deal with:
<?php
/**
*
*/
function csv_entry_to_array(array $row)
{
$column_count = count($row);
$csv_column_values = array();
// Loop through the columns of the current CSV entry and store its value
for ($column_index = 0; $column_index < $column_count; $column_index++)
{
// Store the value of the current CSV entry
$csv_column_values[] = $row[$column_index];
}
// Return
return $csv_column_values;
}
/**
* @param string $input_file_name Filename of input CSV
* @param boolean $include_header_in_output Flag indicating whether the first entry in the CSV is included in the output or not.
* @param integer $length Must be greater than the longest line (in characters) to be found in the CSV file (allowing for trailing line-end characters).
* It became optional in PHP 5. Omitting this parameter (or setting it to 0 in PHP 5.0.4 and later) the maximum line length is
* not limited, which is slightly slower.
* @param string $delimeter Set the field delimiter (one character only).
* @param string $enclosure Set the field enclosure character (one character only).
* @param string $escape Set the escape character (one character only). Defaults as a backslash.
* $return array Nested indexed array representing the CSV. Empty array on error (e.g. input file missing, input file not a CSV).
*/
function csv_file_to_array($input_file_name, $include_header_in_output = TRUE, $length = 1000, $delimeter = ',', $enclosure = '"', $escape = '\\')
{
// NOTE: this attempts to properly recognize line endings when reading files from Mac; has small performance penalty
ini_set('auto_detect_line_endings', TRUE);
$csv_array = array();
// Warnings are supressed, but that's OK since the code handles such warnings
if (($handle = @fopen($input_file_name, "r")) !== FALSE)
{
$row_counter = 0;
// Iterate over the CSV entries
while (($row = fgetcsv($handle, $length, $delimeter, $enclosure, $escape)) !== FALSE)
{
if ($row_counter === 0 && $include_header_in_output === TRUE)
{
// This is the first row in the CSV and it should be included in the output
$csv_array[] = csv_entry_to_array($row);
}
else if ($row_counter > 0)
{
// This is a row in the CSV that needs to be stored in the return array
$csv_array[] = csv_entry_to_array($row);
}
$row_counter++;
}
// Close file handler
fclose($handle);
}
else
{
// Input file: some error occured
return array();
}
return $csv_array;
}
There is a function for reading files in line-wise: file(), which also works on both linebreak types.
And the shortest method to read in the whole CSV file is:
$data = array_map("str_getcsv", file($filename));
Not sure what your $num = count()
was about.