PHP fgetcsv生成了关联数组键错误

时间:2014-07-28 11:13:56

标签: php arrays csv

我刚写了一个php函数,它将从csv文件中读取数据并将数据存储到一个数组中,每个行数据都作为一个元素。每个元素都是一个由csv头键控的关联数组。

该功能如下所示:

function parse_csv($csv_path) {

    if(is_file($csv_path)&&file_exists($csv_path)) {
        $csv_data = array();
        $csv_header = array();
        $n = 0;
        try {
            $csv_file = fopen($csv_path, "r");
            while (!feof($csv_file)) {
                $csv_line = fgetcsv($csv_file); 
                if(array(NULL) !== $csv_line && !empty($csv_line)) {
                    $n++;
                    if($n == 1) {
                        $csv_header = $csv_line;
                    }
                    else {
                        $csv_row = array();
                        for($i=0;$i<count($csv_header);$i++) {
                            $csv_row[$csv_header[$i]] = $csv_line[$i];
                        }
                        $csv_data[] = $csv_row;
                    }
                }
            }

            return $csv_data;
        }
        catch (Exception $e) {
            return FALSE;
        }
    }
    else {
        return FALSE;
    }
}

我已经完成了一项测试,并使用print_r来打印由该函数设计的数组,如下所示:

$csv = parse_csv('D:\countries.csv');
print_r($csv);

输出结果为:

Array
(
    [0] => Array
        (
            [TermName] => Afghanistan
            [TermDescription] => 
            [TermFormat] => 
        )

    [1] => Array
        (
            [TermName] => Albania
            [TermDescription] => 
            [TermFormat] => 
        )

    [2] => Array
        (
            [TermName] => Algeria
            [TermDescription] => 
            [TermFormat] => 
        )

    [3] => Array
        (
            [TermName] => American Samoa
            [TermDescription] => 
            [TermFormat] => 
        )

    [4] => Array
        (
            [TermName] => Andorra
            [TermDescription] => 
            [TermFormat] => 
        )
)

但是当我试图像这样访问单个元素时

print($csv[1]["TermName"]);

我收到了错误:未定义的索引:第49行的C:\ xampp \ htdocs \ test \ test.php中的TermName。

这让我很困惑。我错过了什么吗?

找到原因:

因为我用Windows记事本保存了csv文件,所以它将BOM添加到文件中。因此第一个标题变为[BOM] TermName。删除BOM后,现在一切都很好。

1 个答案:

答案 0 :(得分:0)

您可以缩短代码并使其更具可读性,以便更快地找到错误。

function parse_csv($csv_path) {

    if(is_file($csv_path) && file_exists($csv_path)) {

        $stream = fopen($csv_path, 'r');
        $csvHeader = fgetcsv($stream);
        $csvData = [];
        while(!feof($stream))
        {
            $lineData = [];
            $line = fgetcsv($stream);

            if( count($csvHeader) != count($line) )
            {
                throw new \Exception('Line '.count($csvData)+1.' got more data then headers!');
            }

            foreach($csvHeader as $x => $header)
            {
                $lineData[$header] = $line[$x];
            }

            $csvData[] = $lineData;
        }
        return $csvData;
    }
    return false;
}