
使用 array_merge() 会重置数字键导致 JSON 输出为数组,而通过数组加法(+)或 JSON_FORCE_OBJECT 可确保键名保留并生成标准关联对象格式。
使用 `array_merge()` 会重置数字键导致 json 输出为数组,而通过数组加法(`+`)或 `json_force_object` 可确保键名保留并生成标准关联对象格式。
在 PHP 中,当需要将多个关联数组合并并最终输出为 JSON 对象(而非索引数组)时,必须特别注意键名的处理方式。默认情况下,array_merge() 会对所有数字键(即使以字符串形式定义)进行重新索引,导致 json_encode() 将其识别为顺序数组(如 [1,4,5]),而非期望的关联对象(如 {"1":1,"2":4,"3":5})。
✅ 正确做法一:使用数组联合操作符 +
PHP 的 + 操作符执行“左结合的键名保留合并”——即左侧数组的键值优先,右侧同名键被忽略,且所有键(包括数字键)均原样保留:
<?php $array = [1 => 1, 2 => 4];
$array1 = [3 => 5];
$temp = $array + $array1;
print_r($temp);
// 输出:Array ( [1] => 1 [2] => 4 [3] => 5 )
echo json_encode($temp);
// 输出:{"1":1,"2":4,"3":5} ✅
?>
⚠️ 注意:+ 不会覆盖左侧已存在的键;若需覆盖逻辑,请改用 array_replace() 或手动遍历赋值。
✅ 正确做法二:强制 json_encode() 输出对象(兼容性更强)
即使数组键为连续数字,也可通过 JSON_FORCE_OBJECT 标志强制返回 JSON 对象格式:
<?php $array = ["1" => 1, "2" => 4];
$array1 = ["3" => 5];
$temp = array_merge($array, $array1); // 此时键仍为字符串,但若含纯数字键可能被重索引
echo json_encode($temp, JSON_FORCE_OBJECT);
// 输出:{"1":1,"2":4,"3":5} ✅(无论键是否被重排)
?>
? 关键区别总结
| 方法 | 键名保留 | 覆盖行为 | 适用场景 |
|---|---|---|---|
| $a + $b | ✅ 完全保留(含数字键) | 左侧优先,不覆盖 | 合并关联结构,避免意外重索引 |
| array_merge($a, $b) | ❌ 数字键重索引,字符串键保留 | 后续值覆盖前序同名键 | 仅适用于纯字符串键或明确需重索引的场景 |
| json_encode(..., JSON_FORCE_OBJECT) | ⚠️ 不改变数组结构,仅影响 JSON 输出形态 | 无 | 快速兜底方案,尤其用于 API 兼容性保障 |
? 最佳实践建议
- 若原始数组键为字符串(如 "id", "name"),array_merge() 安全可用;
- 若含显式数字键(如 "1", 2),务必使用 + 或显式声明字符串键(['1' => 1]);
- 对外提供 JSON 接口时,推荐统一添加 JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT 确保格式稳定与可读性。
通过合理选择合并方式与编码选项,可精准控制 PHP 数组到 JSON 的映射行为,避免前端解析异常。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











