I am having trouble accessing the first index of an associative array when parsing from a csv.
CSV:
ID,COLOR
1,Red
2,Green
3,Blue
PHP:
function associative_array_from_csv($csv)
{
$rows = array_map('str_getcsv', file($csv));
$header = array_shift($rows);
$array = array();
foreach($rows as $data) {
$array[] = array_combine($header, $data);
}
return $array;
}
$colors = associative_array_from_csv($csv);
Now $colors returns:
[
[
"ID" => "1",
"COLOR" => "Red",
],
[
"ID" => "2",
"COLOR" => "Green ",
],
[
"ID" => "3",
"COLOR" => "Blue",
],
];
But if I try to access the ID of any color:
$colors[0]["ID"] // returns undefined index: ID
$colors[0]["COLOR"] // returns "Red"
If I loop over the colors I can access the ID like so:
foreach($colors as $color)
{
print_r(reset($color)); // Prints the ID
}
But why I can't access it directly like $colors[0]["ID"]?
Thanks
I had the same issue. The problem was that Excel adds a hidden character to the first cell in the document, for encoding UTF-8 BOM.
I could see this when running:
var_dump(json_encode($array));
This would return:
string(312) "[{"\ufeffemail":"test@me.com","firstName":"import","lastName":"test"},{"\ufeffemail":"test@comcast.net","firstName":"import","lastName":"test"}]"
To remove the \ufeff character, I did:
$header = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $header);
In this case, that would be:
function associative_array_from_csv($csv)
{
$rows = array_map('str_getcsv', file($csv));
$header = array_shift($rows);
$header = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $header);
$array = array();
foreach($rows as $data) {
$array[] = array_combine($header, $data);
}
return $array;
}