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

PHP中使用json_encode转换数组时键名丢失的问题求助

PHP数组json_encode丢失键名的解决办法

问题根因

你碰到的问题是PHP数组的类型决定了json_encode的转换行为:

  • 要是数组是从0开始的连续数字索引,json_encode会把它转成JSON数组,数字键直接被忽略,只保留值的顺序。
  • 要是数组有非连续数字索引或者混合键(字符串+数字),默认会转成JSON对象保留所有键,但如果你的外层数组只有一个非0起始的数字键(比如[1 => [...]]),或者编码时误传了子元素,就会出现键丢失的情况。

解决方法

1. 强制转JSON对象,保留所有键

用json_encode的JSON_FORCE_OBJECT参数,强制把所有数组转成JSON对象,不管是数字键还是字符串键都会被完整保留:

// 你的原数组示例
$arr = [
    1 => [
        'succes' => 1,
        'title' => 'Test Title',
        0 => ['car', 'bus', 'a', 'b', 'c', 'd']
    ]
];

// 带参数执行编码
$json = json_encode($arr, JSON_FORCE_OBJECT);
echo $json;

输出会完整保留外层的1键:

{
    "1": {
        "succes": 1,
        "title": "Test Title",
        "0": ["car", "bus", "a", "b", "c", "d"]
    }
}

2. 检查编码的数组是否正确

确认你传给json_encode的是整个目标数组,而不是$arr[1]这种子元素——要是误传了子元素,自然会丢失外层的1键。

3. 重置索引(不需要保留原数字键时用)

如果不需要保留原数字键,只想转成JSON数组,可以用array_values()重置索引为连续的0起始序列:

$resetArr = array_values($arr);
$json = json_encode($resetArr);

不过这种方式会丢掉原数字键,只保留值的顺序,适合不需要键名的场景。

针对你的情况验证

从你给出的print_r和json_encode结果来看,外层1键丢失,大概率是编码时没传整个数组,或者数组结构被意外修改了。用JSON_FORCE_OBJECT参数能确保所有层级的键都被保留下来。

内容的提问来源于stack exchange,提问作者Köksal Yazılım

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:30:42