PHP array_merge合并数组后json_encode输出对象格式解决方法
问题原因
array_merge 处理键名为数字(包含字符串格式的数字键)的数组时,会自动重置所有键名为从0开始递增的连续整数索引。此时生成的是连续索引数组,json_encode 默认会将这类数组编码为JSON数组格式(即你得到的[1,4,5]),无法输出键值对形式的JSON对象。
同时array_merge已经丢失了原数组的1、2、3键名,即使强制转对象,得到的键也会是重置后的0、1、2,不符合预期。
正确实现方法
要得到{"1":1,"2":4,"3":5}的输出,核心是合并数组时保留原有的数字键名,推荐以下写法:
- 直接使用
+运算符合并数组,该运算符不会重建数组索引,会保留原有键名:
<?php $array = ["1" => 1, "2" =>4]; $array1 = ["3" => 5]; $temp = $array + $array1; echo json_encode($temp); ?>
注意:
+合并数组时,前面数组的同键名值会优先保留,不会被后面数组的同键名值覆盖。如果需要后面数组的同键名值覆盖前面的内容,可以使用array_replace函数,它同样不会重置数字键名:$temp = array_replace($array, $array1);
- 不推荐直接给
json_encode传JSON_FORCE_OBJECT参数的写法,因为array_merge已经重置了键名,最终输出的键会是0、1、2,和你预期的键名不符:
// 该写法输出为{"0":1,"1":4,"2":5},不符合预期 echo json_encode($temp, JSON_FORCE_OBJECT);
内容的提问来源于stack exchange,提问作者Nallabhagan R
相关产品推荐
相关产品推荐

