
本文旨在帮助开发者解决在PHP 8.0及以上版本中出现的“Undefined array key”警告。由于PHP 8.0将一些notice提升为warning级别,原本在低版本中不显眼的问题暴露出来。本文将深入探讨此问题的原因,并提供多种解决方案,确保代码的健壮性和兼容性。
问题根源
在PHP 8.0中,尝试访问未定义的数组键会触发一个警告。 这与之前的版本不同,之前的版本可能只会产生一个notice。 这种变化旨在提高代码质量,强制开发者显式处理数组键可能不存在的情况。
例如,以下代码在PHP 8.0中会触发警告:
<?php $my_array = ['a' => 1, 'b' => 2]; echo $my_array['c']; // Warning: Undefined array key "c" ?>
解决方案
解决“Undefined array key”警告有多种方法,选择哪种方法取决于具体情况和个人偏好。
立即学习“PHP免费学习笔记(深入)”;
1. 使用isset()或array_key_exists()进行检查
这是最常见也是最推荐的方法。 在访问数组键之前,先使用isset()或array_key_exists()检查该键是否存在。
- isset(): 检查变量是否已设置并且不是 NULL。
- array_key_exists(): 检查数组中是否存在指定的键名或索引。
<?php $my_array = ['a' => 1, 'b' => 2]; if (isset($my_array['c'])) { echo $my_array['c']; } else { echo "Key 'c' not found."; } // 或者 if (array_key_exists('c', $my_array)) { echo $my_array['c']; } else { echo "Key 'c' not found."; } ?>
2. 使用null coalescing运算符 (??)
PHP 7引入了null coalescing运算符 ??,可以简洁地处理键不存在的情况。 如果数组键存在且不为 NULL,则返回该键的值;否则,返回提供的默认值。
<?php $my_array = ['a' => 1, 'b' => 2]; echo $my_array['c'] ?? "Key 'c' not found."; ?>
3. 使用错误抑制符 (不推荐)
可以使用错误抑制符 @ 来抑制警告。 但这通常不推荐,因为它会隐藏潜在的问题,并使代码更难调试。
<?php $my_array = ['a' => 1, 'b' => 2]; echo @$my_array['c']; // 抑制警告 ?>
4. 初始化数组键
如果确定在后续代码中需要使用某个数组键,可以在数组创建时或在使用前显式地初始化该键。
<?php $my_array = ['a' => 1, 'b' => 2]; $my_array['c'] = null; // 初始化键 'c' echo $my_array['c']; // 不会触发警告,输出 NULL ?>
针对原始问题代码的修改建议
针对提供的原始代码,可以修改为:
// Sorterar ut lagnamn och resultat $file = file($filename); $result = array_merge($file,$resultatarray); $matchesLines = array(); foreach($result as $line) { if(preg_match('/^([a-öA-Ö]+D)-([a-öA-Ö]+D) (d+)-(d+)/', $line, $data)){ $Hemma_Lag = $data[1]; $Borta_Lag = $data[2]; $Hemma_Resultat = $data[3]; $Borta_Resultat=$data[4]; // 初始化数组键,避免警告 if (!isset($matchesLines[$Hemma_Lag])) { $matchesLines[$Hemma_Lag] = ['Vinst' => 0, 'oavgjord' => 0, 'Förlust' => 0, 'lag' => $Hemma_Lag, 'poang' => 0, 'mål' => 0, 'måli' => 0, 'omgångar' => 0]; } if (!isset($matchesLines[$Borta_Lag])) { $matchesLines[$Borta_Lag] = ['Vinst' => 0, 'oavgjord' => 0, 'Förlust' => 0, 'lag' => $Borta_Lag, 'poang' => 0, 'mål' => 0, 'måli' => 0, 'omgångar' => 0]; } if ($Hemma_Resultat == $Borta_Resultat){ $matchesLines[$Hemma_Lag]['poang']+=1; $matchesLines[$Hemma_Lag]['mål'] += $Hemma_Resultat; $matchesLines[$Hemma_Lag]['måli'] += $Borta_Resultat; $matchesLines[$Hemma_Lag]['oavgjord'] += 1; $matchesLines[$Borta_Lag]['poang'] +=1; $matchesLines[$Borta_Lag]['mål'] += $Borta_Resultat; $matchesLines[$Borta_Lag]['måli'] += $Hemma_Resultat; $matchesLines[$Borta_Lag]['oavgjord'] += 1; } if ($Hemma_Resultat > $Borta_Resultat){ $matchesLines[$Hemma_Lag]['poang']+=3; $matchesLines[$Hemma_Lag]['mål'] += $Hemma_Resultat; $matchesLines[$Hemma_Lag]['måli'] += $Borta_Resultat; $matchesLines[$Hemma_Lag]['Vinst'] += 1; $matchesLines[$Borta_Lag]['poang'] +=0; $matchesLines[$Borta_Lag]['mål'] += $Borta_Resultat; $matchesLines[$Borta_Lag]['måli'] += $Hemma_Resultat; $matchesLines[$Borta_Lag]['Förlust'] += 1; } if ($Hemma_Resultat < $Borta_Resultat) { $matchesLines[$Hemma_Lag]['poang']+=0; $matchesLines[$Hemma_Lag]['Förlust'] += 1; $matchesLines[$Hemma_Lag]['mål'] += $Hemma_Resultat; $matchesLines[$Hemma_Lag]['måli'] += $Borta_Resultat; $matchesLines[$Borta_Lag]['poang'] +=3; $matchesLines[$Borta_Lag]['Vinst'] += 1; $matchesLines[$Borta_Lag]['mål'] += $Borta_Resultat; $matchesLines[$Borta_Lag]['måli'] += $Hemma_Resultat; } $matchesLines[$Borta_Lag]['omgångar']+=1; $matchesLines[$Hemma_Lag]['omgångar']+=1; } }
这个修改的关键在于,在访问 $matchesLines[$Hemma_Lag] 和 $matchesLines[$Borta_Lag] 的任何键之前,先检查它们是否存在。如果不存在,则创建一个包含所有必需键的数组,并将其初始化为零。这样可以避免“Undefined array key”警告。
总结
在PHP 8.0中处理“Undefined array key”警告是提高代码质量的重要一步。 通过使用isset()、array_key_exists()、null coalescing运算符或初始化数组键,可以有效地避免这些警告,并确保代码在PHP 8.0及更高版本中正常运行。 推荐优先使用isset()或array_key_exists()进行检查,其次考虑使用null coalescing运算符。 避免使用错误抑制符,因为它会隐藏潜在的问题。
以上就是解决PHP 8.0中“Undefined array key”警告的详细内容,更多请关注php php Array NULL 运算符 undefined


