
本文详解如何将数据库中存储的 json 格式物品列表(如角色背包数据)安全解码并使用 foreach 循环逐项处理,避免因误用数组键名导致的错误。
你提供的 JSON 数据是一个索引数组(indexed array),而非关联数组——它由多个对象(PHP 中对应为关联数组)组成,外层没有 "name" 或其他顶层键。因此,直接写 $inventoryjson['name'] 会触发 Notice: Undefined index: name 错误,因为 $inventoryjson 本身就是一个以数字为键的数组(例如 [0] => [...], [1] => [...]),而非形如 ["name" => "..."] 的结构。
✅ 正确做法是:先 json_decode($json, true) 得到 PHP 关联数组(实际是数值索引的数组),再用 foreach 遍历每一项:
$inventory = $karakter['inventory']; // 从数据库取出的 JSON 字符串
$items = json_decode($inventory, true);
// 检查解码是否成功(强烈建议!)
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('Invalid JSON in inventory: ' . json_last_error_msg());
}
// 安全遍历每个物品
foreach ($items as $item) {
echo "名称: {$item['name']}, 数量: {$item['count']}, 槽位: {$item['slot']}\n";
// 处理可选字段(如 info 可能为字符串、数组或 null)
if (isset($item['info']) && is_array($item['info'])) {
echo " 附加信息: " . json_encode($item['info'], JSON_UNESCAPED_UNICODE) . "\n";
} elseif (is_string($item['info']) && !empty($item['info'])) {
echo " 说明: {$item['info']}\n";
}
}⚠️ 注意事项:
- 始终检查 json_decode() 返回值是否为 null(解码失败时返回 null),并配合 json_last_error() 进行调试;
- 不要假设所有字段都存在(如部分物品无 info),使用 isset() 或 array_key_exists() 判断;
- 若需修改后重新存入数据库,记得用 json_encode($items, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) 保证中文和格式友好;
- 在生产环境避免直接 echo 调试内容,应记录日志或返回结构化响应。
通过这种方式,你可以稳定、清晰地解析任意长度的 JSON 物品列表,并灵活访问每个字段,为库存管理、UI 渲染或服务端逻辑提供可靠数据基础。
立即学习“PHP免费学习笔记(深入)”;











