PHP判断数组非空后仍报Undefined array key 0错误原因求解
问题根源
你触发报错的核心原因是:非空的数组不一定存在下标为0的键。
你的代码逻辑中,循环计数器$i不管本轮是否匹配到DataCode都会全局自增,当首次匹配到DataCode的轮次不是第一轮时,$this->data的下标会从大于0的数值开始。举个实际触发错误的场景:
- 第一轮循环
$i=0,未匹配到对应DataCode,不会给$this->data[0]赋值 - 第二轮循环
$i=1,匹配到对应DataCode,给$this->data[1]赋值 - 循环结束后
$this->data内容为[1 => ['data_id' => xxx, 'data_name' => xxx]]
此时!empty($this->data)判断结果为真,但访问$this->data[0]就会抛出数组键不存在的错误。
修复方案
可任选以下一种方案适配你的业务逻辑:
- 方案1:调整下标赋值逻辑,保证数组下标从0开始连续
直接在匹配到DataCode时用[]自动追加元素,不需要单独维护计数器:
$this->data = []; foreach($core_data as $core) { $dataCode = DataCode::where('code', $core->code)->first(); if ($dataCode instanceof DataCode) { $this->data[] = [ 'data_id' => $dataCode->id, 'data_name' => $dataCode->name ]; } }
- 方案2:不硬编码下标0,直接读取数组第一个元素
if (!empty($this->data)) { $data = Data::create([ 'first_name' => reset($this->data)['data_name'] ]); }
- 方案3:直接判断下标0是否存在再执行后续操作
if (isset($this->data[0])) { $data = Data::create([ 'first_name' => $this->data[0]['data_name'] ]); }
内容的提问来源于stack exchange,提问作者lky
相关产品推荐
相关产品推荐

