You need to enable JavaScript to run this app. PHP循环操作数组时出现Illegal string offset 'id'错误如何修复
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 22:06:03