array_keys返回的数字大于end($ array)

时间:2018-09-11 12:50:11

标签: php arrays csv

我有一个包含约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

1 个答案:

答案 0 :(得分:4)

您的行比您传递给$length的{​​{1}}参数长。在the documentation中,重点是我:

  

必须大于CSV文件中可以找到的最长行(以字符为单位)(允许尾随行尾字符)。 否则,该行将拆分为fgetcsv()个字符的块,除非拆分将发生在附件内。

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

length