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



我有一个包含大约 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
OS: Linux Mint

您的行比传递给fgetcsv()$length参数长。从文档中,强调我的:

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

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

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