Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数组\返回的键数大于结束($array)_Php_Arrays_Csv - Fatal编程技术网

Php 数组\返回的键数大于结束($array)

Php 数组\返回的键数大于结束($array),php,arrays,csv,Php,Arrays,Csv,我有一个CSV文件,包含大约8500行,但我得到了一个非常奇怪的“错误” 我正在验证CSV中的数据,以确保数据可以导入数据库。目前我只是将数据错误记录到日志文件中,但当我打开它时,我会看到高达8800行(给定或获取)的错误报告 我做了一些基本的调试,看看是什么,并从以下几点开始: foreach ($csv as $key => $row) { if ($key > 8500) { echo '<pre>'; print_r($ro

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

我正在验证CSV中的数据,以确保数据可以导入数据库。目前我只是将数据错误记录到日志文件中,但当我打开它时,我会看到高达8800行(给定或获取)的错误报告

我做了一些基本的调试,看看是什么,并从以下几点开始:

foreach ($csv as $key => $row)
{
    if ($key > 8500) {
        echo '<pre>';
        print_r($row);
        echo '</pre>';
    }
}
这显示了一个包含预期数据的数组。但是,当我这样做时:

$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);
}
然后显示8800(给定或获取)值。执行
count($csv)
返回相同的数字

我试着进入实际的CSV,突出显示最后一行下面的所有内容并点击清除,但仍然有相同的效果。。 以下是我如何构建我的
$csv
阵列:

while (($csvData = fgetcsv($handle)) !== false)
我是否做错了构建阵列时看不到的事情,还是这种意外行为

PHP版本:7.1
操作系统:LinuxMint


您的行比传递给
fgetcsv()
$length
参数长。我的重点是:

必须大于CSV文件中的最长行(以字符为单位)(允许尾随行结束字符)否则,该行将被拆分为
长度
字符块
,除非拆分发生在存储模块内

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


如果可以,将接受:)是否值得在附加到数组之前对数据使用
trim
,以尝试避免尾随字符?出现尾随空元素是因为某些行被拆分为多个部分。如果您取消了限制(即
1000
),则不会再出现这种情况(假设您的CSV中的所有“单元格”都包含数据)。我在使用
fgetcsv
之前从未见过这种情况!每天学点新东西:)泰:)
$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);
}
while (($csvData = fgetcsv($handle)) !== false)