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

标签 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 version: 7.1
OS: Linux Mint

最佳答案

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

Must be greater than the longest line (in characters) to be found in the CSV file (allowing for trailing line-end characters). Otherwise the line is split in chunks of length characters, unless the split would occur inside an enclosure.

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

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

关于php - array_keys 返回的数字大于 end($array),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52276384/

相关文章:

c - C 数组中的指针地址

mysql - 我可以使用相对路径将csv文件导入mysql吗?

python - 从 csv 文件读取时, Pandas 添加列

c# - 如何把HH :mm:ss formatted times in CSV so Excel formats them as regular text?

php - 我想从 mysql 数据库中导出一个 excel。我想在复选框的帮助下获得用户的列名

php - 在 PHP MySQL 中使用 id 显示 URL href 链接

php - 同一页面上的 Wordpress 多个短代码不会保持元素顺序

php - 安装 php 5.2 ubuntu

javascript - 循环遍历数组,将每个索引放在新行上,并在警报中显示最终结果

java - Java中如何获取两个n维数组的和?