【问题标题】:array_keys returning higher number than end($array)array_keys 返回大于 end($array) 的数字
【发布时间】:2018-09-11 12:50:10
【问题描述】:

我有一个包含大约 8500 行的 CSV 文件,但我遇到了一个非常奇怪的“错误”。

我正在验证 CSV 中的数据,以确保数据能够很好地导入数据库。我目前只是将数据错误记录到日志文件中,但是当我打开它时,我看到最多 8800 行的错误报告(给予或接受)。

我做了一些基本的调试来看看是什么,然后开始这样做:

foreach ($csv as $key => $row)
{
    if ($key > 8500) {
        echo '<pre>';
        print_r($row);
        echo '</pre>';
    }
}

而且只返回了大约 50/60,这很好,因为总行数在这个数字附近。

然后我尝试这样做以获得最终的数组结果:

$last = end($csv);
print_r($last);

这显示了一个包含预期数据的数组。但是,当我这样做时:

var_dump(array_keys($csv));

然后它显示 8800(给予或接受)值。执行count($csv) 返回相同的数字。

我尝试进入实际的 CSV 并突出显示最后一行下方的所有内容并点击清除,但它仍然具有相同的效果.. 以下是我构建 $csv 数组的方法:

$skus = $csv = [];

if (($handle = fopen($fileTmp, 'r')) !== false) {
    set_time_limit(0);
    $i = 0;

    while (($csvData = fgetcsv($handle, 1000, ',')) !== false)
    {
        $colCount = count($csvData);

        $csv[$i]['sku'] = $csvData[0];
        $csv[$i]['desc'] = $csvData[1];
        $csv[$i]['ean'] = $csvData[2];
        $csv[$i]['rrp_less_vat'] = $csvData[3];
        $csv[$i]['rrp_inc_vat'] = $csvData[4];
        $csv[$i]['stock'] = $csvData[5];
        $csv[$i]['est_delivery'] = $csvData[6];
        $csv[$i]['img_name'] = $csvData[7];
        $csv[$i]['vatable'] = $csvData[8];
        $csv[$i]['obsolete'] = $csvData[9];
        $csv[$i]['dead'] = $csvData[10];
        $csv[$i]['replacement_product'] = $csvData[11];
        $csv[$i]['brand'] = $csvData[12];
        $csv[$i]['ext_desc'] = $csvData[13];

        $i++;
    }

    fclose($handle);
}

我是在做一些在构建数组时看不到的错误,还是这是意外行为?

PHP 版本:7.1
操作系统:Linux Mint

【问题讨论】:

    标签: php arrays csv


    【解决方案1】:

    您的行比您传递给fgetcsv()$length 参数长。来自the documentation,强调我的:

    必须大于 CSV 文件中的最长行(以字符为单位)(允许尾随行尾字符)。 否则,行会被分割成length 字符的块,除非分割发生在外壳内。

    最简单的解决方法是停止将行的长度限制为 1000:

    while (($csvData = fgetcsv($handle)) !== false)
    

    【讨论】:

    • 我会接受 :) 在附加到数组之前是否值得在数据上使用trim 以避免尾随字符?
    • 出现尾随空元素是因为某些行被拆分为多个部分。如果您取消限制(1000),则不应再发生这种情况(假设 CSV 中的所有“单元格”都包含数据)。
    • 我觉得很奇怪,以前在使用fgetcsv 时从未见过这种情况!每天学习新东西:) ty :)
    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多