PHP合并两个数组后用json_encode返回,关键在区分索引数组(用array_merge得JSON数组[])和关联数组(用+或array_merge得JSON对象{}),并加JSON_UNESCAPED_UNICODE等flag避免中文转义。

PHP合并两个数组后直接用 json_encode() 返回即可,关键在于合并方式是否符合你期望的 JSON 结构(比如索引数组还是关联数组、是否去重、键如何处理)。
确认数组类型和合并目的
PHP 有两种常见数组:索引数组(数字键)和关联数组(字符串键)。合并方式不同,json_encode 输出结果差异很大:
- 两个索引数组用
array_merge($a, $b)→ 得到新索引数组,JSON 是标准数组形式[...] - 两个关联数组用
array_merge($a, $b)→ 后面的键会覆盖前面同名键,适合配置合并 - 想保留所有键且不覆盖?用
$c = $a + $b(+ 号合并),左边优先,重复键不会被替换
常用合并 + JSON 返回写法
假设你有两个数组:
$arr1 = ['name' => 'Alice', 'age' => 25]; $arr2 = ['city' => 'Beijing', 'job' => 'Engineer'];
✅ 推荐组合(保留全部键,无覆盖):
立即学习“PHP免费学习笔记(深入)”;
$merged = $arr1 + $arr2;
header('Content-Type: application/json; charset=utf-8');
echo json_encode($merged, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
输出:{"name":"Alice","age":25,"city":"Beijing","job":"Engineer"}
⚠️ 注意:json_encode() 默认对中文转义(如 "\u4f60"),加 JSON_UNESCAPED_UNICODE 可保持原文;斜杠转义(如 \/)也可用 JSON_UNESCAPED_SLASHES 去掉。
如果是索引数组,注意 key 重排
例如:
$list1 = ['a', 'b']; $list2 = ['c', 'd'];
用 array_merge($list1, $list2) → ['a','b','c','d'],JSON 是 ["a","b","c","d"]
但用 $list1 + $list2 → 因为键都是 0,1,$list2 的 0,1 会被忽略,结果仍是 ['a','b']。
所以索引数组合并务必用 array_merge,别用 +。
遇到 null 或非 UTF-8 字符导致 json_encode 失败?
json_encode 返回 false 时,可用 json_last_error_msg() 查原因:
$json = json_encode($merged, JSON_UNESCAPED_UNICODE);
if ($json === false) {
error_log('JSON encode failed: ' . json_last_error_msg());
http_response_code(500);
exit('Invalid data');
}
常见原因:数组含资源、对象未实现 JsonSerializable、字符串含 GBK 等非 UTF-8 编码。确保所有字符串是 UTF-8(可用 mb_convert_encoding() 转换)。



















