当从CSV解析时,php关联数组的第一个键返回未定义的索引

时间:2017-04-14 15:40:03

标签: php

从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);

现在$colors返回:

[
    [
        "ID"    => "1",
        "COLOR" => "Red",
    ],
    [
        "ID"    => "2",
        "COLOR" => "Green ",
    ],
    [
        "ID"    => "3",
        "COLOR" => "Blue",
    ],
];

但如果我尝试访问任何颜色的ID

$colors[0]["ID"]    // returns undefined index: ID
$colors[0]["COLOR"] // returns "Red"

如果我循环上面的颜色,我可以这样访问ID

foreach($colors as $color) 
{ 
    print_r(reset($color)); // Prints the ID 
}

但为什么我无法像$colors[0]["ID"]那样直接访问它?

由于

1 个答案:

答案 0 :(得分:0)

我有同样的问题。问题是Excel为文档的第一个单元格添加了一个隐藏字符,以对UTF-8 BOM进行编码。

我可以在运行时看到它:

var_dump(json_encode($array));

这将返回:

string(312) "[{"\ufeffemail":"test@me.com","firstName":"import","lastName":"test"},{"\ufeffemail":"test@comcast.net","firstName":"import","lastName":"test"}]"

要删除\ ufeff字符,我做了:

$header = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $header);

在这种情况下,应该是:

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;
}