You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:40:38