
当使用 array_merge() 合并关联数组时,PHP 会将结果视为“索引数组”(即使键为字符串数字),导致 json_encode() 输出方括号格式;改用数组联合操作符 + 或强制 JSON_FORCE_OBJECT 可确保生成标准 JSON 对象。
当使用 `array_merge()` 合并关联数组时,php 会将结果视为“索引数组”(即使键为字符串数字),导致 `json_encode()` 输出方括号格式;改用数组联合操作符 `+` 或强制 `json_force_object` 可确保生成标准 json 对象。
在 PHP 中,array_merge() 的行为是:当输入数组均为数值键(即使以字符串形式书写,如 "1")且键连续时,它会重排索引,将结果转为纯索引数组。这正是问题中 ["1" => 1, "2" => 4] 与 ["3" => 5] 合并后输出 [1,4,5] 的根本原因——json_encode() 检测到这是一个「索引数组」,便序列化为 JSON 数组([]),而非对象({})。
✅ 正确做法一:使用数组联合操作符 +
该操作符保留左侧数组的全部键值对,并仅将右侧数组中不存在于左侧的键加入结果,且完全不修改原始键名(包括字符串数字键):
<?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 和 $array1 存在相同键(如 "2"),$array 的值会被保留,$array1 的同键值被忽略。
✅ 正确做法二:强制 JSON 对象编码(兼容性更强)
若无法控制数组结构(例如动态生成、含混合键类型),或需确保任何数组都输出为 JSON 对象,可直接使用 JSON_FORCE_OBJECT 标志:
<?php $array = ["1" => 1, "2" => 4];
$array1 = ["3" => 5];
$temp = array_merge($array, $array1); // 仍可用 array_merge
echo json_encode($temp, JSON_FORCE_OBJECT);
// 输出:{"0":1,"1":4,"2":5} ← 注意:此时键已被重索引为 0,1,2
// 若需保持原键,必须先用 + 合并,再加标志:
$temp = $array + $array1;
echo json_encode($temp, JSON_FORCE_OBJECT);
// 输出:{"1":1,"2":4,"3":5} ← 完美匹配需求
?>
? 关键总结:
- array_merge() → 适用于数值索引数组合并,但会重置/重排关联键;
- + 操作符 → 专为关联数组设计,保留所有显式键名,是合并配置项、映射表等场景的首选;
- JSON_FORCE_OBJECT → 是兜底方案,但不能修复 array_merge() 导致的键丢失,应与 + 配合使用;
- 始终检查数组实际键类型:var_dump(array_keys($arr)) 可确认键是否为字符串或整型,避免隐式转换陷阱。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











