使用array_map在第一个键中双引号的问题

时间:2018-12-03 12:24:02

标签: php

使用下面的代码,我可以从CSV文件创建一个关联数组。 它工作正常,唯一的问题是,每行的第一个键都用双引号(“)保存,我不明白为什么。

/* Map Rows and Loop Through Them */
$rows   = array_map(function($row) { return str_getcsv($row, ';', '"'); }, file('test.csv'));
$header = array_shift($rows);
$csv    = array();
foreach($rows as $row) {
    $csv[] = array_combine($header, $row);   
}

echo "<pre>";
print_r($csv);
echo "</pre>";

当我打印时,我得到了

Array
(
    [0] => Array
        (
            ["TEST"] => 
            [EMAIL] => mail@test.com
            [NAVN] => Donald Duck
            [ADDRESSE] => Paradisæblevej 111
            [POSTNRBY] => 1234  Andeby
            [TELEFON] => 12345678
            [TUR] => 49
            [TURNAVN] => Title
            [ANTAL] => 1
            [BELOEBIALT] => 695
            [BONKODE] => 99900714
        )

    [1] => Array
        (
            ["TEST"] => 
            [EMAIL] => mail@test.com
            [NAVN] => Donald Duck
            [ADDRESSE] => Paradisæblevej 111
            [POSTNRBY] => 1234  Andeby
            [TELEFON] => 12345678
            [TUR] => 49
            [TURNAVN] => Title
            [ANTAL] => 1
            [BELOEBIALT] => 695
            [BONKODE] => 99900714
        )

)

我的标题如下:

"TEST";"EMAIL";"NAVN";"ADDRESSE";"POSTNRBY";"TELEFON";"TUR";"TURNAVN";"ANTAL";"BELOEBIALT";"BONKODE"

CSV文件如下所示:

"TEST";"EMAIL";"NAVN";"ADDRESSE";"POSTNRBY";"TELEFON";"TUR";"TURNAVN";"ANTAL";"BELOEBIALT";"BONKODE"
"";"mail@test.com";"Donald Duck";"Paradisæblevej 111";"1234  Andeby";"12345678";"49";"Title";"1";"695";"99900714"
"";"mail@test.com";"Donald Duck";"Paradisæblevej 111";"1234  Andeby";"12345678";"49";"Title";"1";"695";"99900714"

请注意“测试”中的引号... 我该如何解决?

谢谢

1 个答案:

答案 0 :(得分:2)

这是一个猜测:您的文件以Unicode BOM(字节顺序标记)开头,该文件是不可见的,但使str_getcsv确信此单元格不是用引号引起来的。

要测试它:在编辑器中打开csv文件,并将其另存为Latin-1或任何其他8位编码。问题应该消失了(但是您可能会破坏内容)。

要修复此问题:理想情况下,打开文件时应指定正确的编码(utf-8?)。但是,PHP似乎并未定义UTF-8 + BOM编码。因此,您可以尝试将this问题的答案中的(丑陋)解决方案应用于大约相同的问题。 (或者您可以切换到Python,它的编码为utf-8-bom :-P)