在使用str_getcsv
读取CSV文件并为其分配密钥时,我在解决此未定义的偏移通知时遇到了很多麻烦。
我已经尝试了isset
和array_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文件确实有一些空白单元格。那些空白的细胞将被维护(我无法做任何事情)。
请有人能指出我正确的方向吗?非常感谢任何帮助,谢谢!
答案 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]];
}
}
}