【问题标题】:PHP fgetcsv generated associative array key errorPHP fgetcsv 生成关联数组键错误
【发布时间】:2014-09-19 13:40:32
【问题描述】:

我刚刚编写了一个 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 后,现在一切正常。

【问题讨论】:

  • 你能粘贴更多代码吗?
  • 您缺少您尝试过的代码。请粘贴。
  • 刚刚添加了功能码,谢谢各位。
  • 请检查我的答案并使用此功能测试您的 csv 文件。没有理由无法使用您提供的代码访问您的数组

标签: php arrays csv


【解决方案1】:

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

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

【讨论】:

  • 你好 ins0,测试了这个功能。错误仍然相同。这很奇怪。
  • 非常奇怪,请发布您如何测试功能的完整代码
  • 功能码和你贴的一模一样。调用只是 $csv = parse_csv('D:\countries.csv');print($csv[0]['TermName']);返回错误:注意:未定义索引:第 78 行 C:\xampp\htdocs\test\test.php 中的 TermName
  • 当您在 csv 文件中声明您的密钥时,可能混合了两种不同的字符集 - csv 字符集和 php 字符集,但这不可能是错误
  • 谢谢ins0。最后发现它是csv文件的BOM。所以键'TermName'被附加了一个前缀。删除 BOM 后,它按预期工作。
猜你喜欢
  • 2013-01-28
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多