PHP str_getcsv获取未定义的偏移量

时间:2017-11-07 14:51:52

标签: php arrays csv fgetcsv

在使用str_getcsv读取CSV文件并为其分配密钥时,我在解决此未定义的偏移通知时遇到了很多麻烦。

我已经尝试了issetarray_key_exists,这已经在其他主题中提到了。 isset确实解决了未定义的索引通知,但我无法删除未定义的偏移通知:

$file = file("lookup.csv",FILE_SKIP_EMPTY_LINES);
$csv = array_map("str_getcsv",$file, array_fill(0, count($file), ';'));
$keys = array_shift($csv);
    foreach ($csv as $i=>$row) {
        $csv[$i] = array_combine($keys, $row);  
    }
$numberOfRows = count($csv);
$numberOfColumns = count(current($csv));
    for ( $i = 0; $i <= $numberOfRows; $i ++ ) {  // first loop to run thru to find correct sku template name in csv file
      if ( $csv[$i]['sku'] === $sku ) { // if sku matches  // Getting Undefined offset on this line
        for ( $j = 0; $j <= $numberOfColumns; $j++) {  // second loop to create variables from header line
            ${$keys[$j]} = isset($csv[$i][$keys[$j]]) ? $csv[$i][$keys[$j]] : ''; //  // Getting 2 Undefined offset notices on this line
            }
        }
    }

有问题的CSV文件确实有一些空白单元格。那些空白的细胞将被维护(我无法做任何事情)。

请有人能指出我正确的方向吗?非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

尝试删除数组中的最后一个元素,它有时是一个空项,因为在实际最后一行的末尾有一个新行字符,因此拾取文件中的额外行。

$csv = array_map("str_getcsv",$file, array_fill(0, count($file), ';'));
array_pop($csv);

答案 1 :(得分:0)

好吧,我实际上已经设法弄明白了。

解决方案是添加isset - 以防万一它可以帮助其他人,这是我的解决方案:

    for ( $i = 0; $i <= $numberOfRows; $i ++ ) {

    $csv[$i]['sku'] = isset($csv[$i]['sku']) ? $csv[$i]['sku'] : ''; // <-- isset added

      if ( $csv[$i]['sku'] === $sku ) {

        for ( $j = 0; $j <= $numberOfColumns; $j++) {

                $keys[$j] = isset($keys[$j]) ? $keys[$j] : ''; // <-- isset added

                $csv[$i][$keys[$j]] = isset($csv[$i][$keys[$j]]) ? $csv[$i][$keys[$j]] : '';

                ${$keys[$j]} = $csv[$i][$keys[$j]];
            }
        }
    }