PHP中合并两个数组的核心思路是:以一个数组为基准遍历,用array_column将另一数组按id转为键值映射,再逐条array_merge;时间复杂度从O(n×m)降至O(n+m),若id重复则array_column仅保留最后一个。

PHP中把两个数组按相同 id 字段合并成一条记录,核心思路是:以其中一个数组为基准,遍历它,并从另一个数组中查找 id 相同的项,然后合并字段。常用且高效的方式是先将第二个数组按 id 建立键值映射(即用 id 作键),再逐条合并。
用 id 作为键预处理第二个数组
这是最推荐的做法,避免嵌套循环,时间复杂度从 O(n×m) 降到 O(n+m):
- 用
array_column($arr2, null, 'id')快速将第二个数组转为以id为键的关联数组 - 遍历第一个数组,用当前元素的
id去查预处理后的数组,存在则用array_merge合并 - 注意:若存在重复
id,array_column只保留最后一个,如需保留全部,需手动循环构建
手动遍历 + 合并(兼容低版本 PHP)
如果不能用 array_column(..., null, 'id')(如 PHP
- 新建空数组
$map = [] - 遍历
$arr2,执行$map[$item['id']] = $item - 再遍历
$arr1,用isset($map[$v['id']])判断是否存在匹配项,有则合并
合并时处理字段冲突
两个数组可能有同名字段(如都含 name 或 status),需明确覆盖规则:
立即学习“PHP免费学习笔记(深入)”;
- 默认用
array_merge($a, $b)时,$b的值会覆盖$a的同名字段 - 如想优先保留第一个数组的字段,可改用
array_merge($b, $a),或用+运算符(后者不递归,仅顶层覆盖) - 更稳妥方式:显式指定字段,例如
['id' => $a['id'], 'title' => $a['title'], 'desc' => $b['desc'] ?? '']
完整示例代码
假设:$users 含 id, name;$profiles 含 id, age, city:
$profiles_map = array_column($profiles, null, 'id');
$result = [];
foreach ($users as $u) {
$merged = $u;
if (isset($profiles_map[$u['id']])) {
$merged = array_merge($u, $profiles_map[$u['id']]);
}
$result[] = $merged;
}
// $result 即为按 id 合并后的数组



















