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
相关产品推荐
相关产品推荐

