PHP循环操作数组时出现Illegal string offset 'id'错误如何修复
错误原因
- 你直接把JSON格式字符串当作PHP数组操作:
$user->items初始存储的是JSON字符串,仅支持数字下标读取单个字符,无法使用"id"这类字符串键访问,这是报错的直接诱因。 - 循环内错误的类型转换逻辑:你每次循环执行后都用
json_encode()把$user->items转成字符串,哪怕首次执行前转成了数组,第一次循环结束后变量类型又变回字符串,后续循环访问依旧会报错。 array_merge()参数类型不匹配:该函数要求入参均为数组,你直接传入JSON字符串作为参数,本身也会触发类型错误。
修复方案
所有操作优先针对PHP数组执行,全部逻辑处理完成后再统一转成JSON存回即可,修复后代码如下:
// 提前将JSON解码为PHP关联数组,第二个参数传true确保返回数组而非对象 $items = json_decode($user->items, true); // 提前取数组长度作为循环边界,避免越界,也可避免追加元素后死循环 $itemCount = count($items); for($i = 0; $i < $itemCount; $i++){ if($items[$i]["id"] != $item->id){ // 若$drop_item是单条数据,需要包裹为数组再合并,避免键名被拆 $items = array_merge($items, [$drop_item]); } else { $items[$i] = array_merge($items[$i], ['amount' => 99]); } } // 全部处理完成后,统一转JSON存回原属性 $user->items = json_encode($items);
补充说明
如果你的业务逻辑需要让循环中新增的$drop_item也参与后续的id判断,把循环边界的$itemCount替换成count($items)即可,会实时读取最新的数组长度。如果$drop_item本身就是包含多条数据的数组,去掉合并时包裹的[]即可。
内容的提问来源于stack exchange,提问作者Wenzzi
相关产品推荐
相关产品推荐

