PHP7.4升级至8.0后array_key_exists报错的重构方法咨询
从PHP 7.4.33升级到8.0.27后,核心页面出现以下错误:
PHP警告:Undefined array key 1981,位于drivers_standing_table.php第56行
PHP致命错误:Uncaught TypeError: array_key_exists(): Argument #2 ($array) must be of type array, null given,位于drivers_standing_table.php第56行
其中1981是对应参赛者的数据库ID(整数),相关代码片段如下:
// LINE 56: if (array_key_exists($round, $shared_drivers[$driver_id])) { $lender_id = $shared_drivers[$driver_id][$round]; $lender_race_result = $drivers_race_result_array[$lender_id][$round][0]; $cls_name = $drivers_race_result_array[$lender_id][$round][1]; $race_result = $drivers_race_result_array[$driver_id][$round][0]; if (array_key_exists($round, $drivers_race_result_array[$driver_id])) { ?> <td align='center' style="background: orangered;"> <?php echo $race_result . '/' . $lender_race_result; ?> </td> <?php $exit_flag = true; $i++; } else { ?> <td align='center' class='<?php echo $cls_name; ?>'> <?php echo $lender_race_result; ?> </td> <?php } }
错误导致脚本终止,页面无法正常加载,需重构第56行代码适配PHP 8。
PHP 8.0对类型检查更严格,array_key_exists()要求第二个参数必须是数组,而你的代码中$shared_drivers[$driver_id]可能为null或未定义,直接触发了致命错误;同时"Undefined array key 1981"说明$shared_drivers[1981]这个键不存在。
方式1:逐层验证父数组的合法性
将第56行的条件修改为:
if (isset($shared_drivers[$driver_id]) && is_array($shared_drivers[$driver_id]) && array_key_exists($round, $shared_drivers[$driver_id])) {
isset($shared_drivers[$driver_id]):先确认当前参赛者ID对应的键存在,消除"Undefined array key"警告is_array($shared_drivers[$driver_id]):确保该值是数组,符合array_key_exists()的参数类型要求- 最后再检查
$round是否存在于该数组中
方式2:用空合并运算符简化代码
先给可能不存在的$shared_drivers[$driver_id]设置默认空数组,再进行检查:
$driverSharedData = $shared_drivers[$driver_id] ?? []; if (is_array($driverSharedData) && array_key_exists($round, $driverSharedData)) {
这种写法更简洁,避免了多层嵌套条件,同时保证后续操作的数组合法性。
额外优化建议
后续代码中类似$drivers_race_result_array[$lender_id][$round][0]的多层数组访问,也建议添加存在性检查,比如:
if (isset($drivers_race_result_array[$lender_id][$round]) && is_array($drivers_race_result_array[$lender_id][$round])) { $lender_race_result = $drivers_race_result_array[$lender_id][$round][0]; $cls_name = $drivers_race_result_array[$lender_id][$round][1]; }
避免PHP 8中出现更多Undefined key警告或错误。
内容的提问来源于stack exchange,提问作者Andrew Abbott

