默认返回对象,需传true才得数组;合并前须检查是否为数组、键名一致、结构统一,否则易报错或静默失败。

PHP 中 json_decode() 返回的是对象还是数组?
默认情况下,json_decode() 返回 stdClass 对象,不是数组,直接用 array_merge() 会报错:Warning: array_merge(): Expected parameter 1 to be an array。必须显式传入第二个参数 true 才能得到关联数组。
常见错误写法:
$a = json_decode('{"x":1}');
$b = json_decode('{"y":2}');
array_merge($a, $b); // ❌ 失败:$a 和 $b 都是对象
正确做法:
- 统一用
json_decode($json, true)解析为数组 - 解析前先检查是否成功:
json_last_error() === JSON_ERROR_NONE - 空 JSON 或 null 输入会导致返回
null,合并前需过滤掉非数组值
合并多个 JSON 解析后的数组(含嵌套)
如果 JSON 数据结构一致(例如都是平铺的关联数组),直接用 array_merge() 即可;但如果含嵌套数组或想深度合并(如合并同名键下的子数组),就得换方法。
示例场景:两个 API 返回的用户列表,都含 data 字段,你想把所有 data 合并成一个数组:
$json1 = '{"data":[{"id":1,"name":"A"}]}';
$json2 = '{"data":[{"id":2,"name":"B"}]}';
$arr1 = json_decode($json1, true);
$arr2 = json_decode($json2, true);
// 想要结果:['data' => [item1, item2]]
$result = [
'data' => array_merge($arr1['data'] ?? [], $arr2['data'] ?? [])
];
注意点:
-
?? []防止键不存在导致array_merge()报Warning - 不要用
+运算符合并关联数组——它不覆盖重复键,且不递归 - 若需深度合并(比如两个数组都有
profile键且都想合并其内部字段),改用array_replace_recursive()
遇到数字索引数组时,array_merge() 和 + 的行为差异
JSON 解析后若含纯数字索引(如 [1,2,3]),array_merge() 会重排索引,+ 则保留原索引但忽略后出现的重复键。
例如:
$a = json_decode('[1,2]', true); // [0=>1, 1=>2]
$b = json_decode('[3,4]', true); // [0=>3, 1=>4]
var_dump(array_merge($a, $b)); // [0=>1, 1=>2, 2=>3, 3=>4] ✅
var_dump($a + $b); // [0=>1, 1=>2] ❌ 只取左边
所以:数字索引数组合并,无条件选 array_merge();关联数组若明确要“左优先覆盖”,才考虑 +,但多数情况仍推荐 array_merge() 加空数组兜底。
合并前必须检查的三件事
实际项目中,JSON 来源不可控,合并失败往往不是语法问题,而是数据形态没对齐:
- 确认每个
json_decode($x, true)返回的是array类型,不是null(用is_array()判定) - 确认键名完全一致,比如
"count"和"Count"在 PHP 中是不同键 - 确认没有意外的嵌套层级,比如一个返回
["items" => [...]],另一个直接返回[...]—— 这种得先 normalize 结构再合并
最易被忽略的是:API 返回的 JSON 可能是字符串、null、甚至 HTML 错误页,json_decode() 对这些输入一律返回 null,不做类型检查就进 array_merge(),整段逻辑就静默崩了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











