合并对象数组默认不合并对象属性,仅拼接元素;可用array_merge或[]追加实现零侵入保留;按id去重需转换为数组操作;深度合并须先转数组再处理;去重可用spl_object_hash确保实例唯一。

直接拼接对象数组(最常用,100%保留所有对象及属性)
用 array_merge() 或 [] 追加 即可,每个对象作为独立元素存入新数组,属性原封不动。
-
array_merge($arr1, $arr2):数字索引重排,适合纯列表拼接 -
foreach ($arr2 as $obj) { $arr1[] = $obj; }:追加到末尾,索引连续递增
✅ 优点:零侵入、无副作用,所有对象及其私有/公有属性全部保留。
按唯一标识合并(如 id 字段),避免重复对象但保留各自属性
若两个数组含相同 id 的对象,你想“以第一个为准,只补充第二个中缺失的 id”,可用手动遍历 + 键去重:
- 先用
array_column($arr1, null, 'id')提取 $arr1 的 id → 对象映射 - 再遍历 $arr2,仅当
!isset($result[$obj['id']])时才加入
⚠️ 注意:这要求对象是数组格式或公开属性可访问;若为标准对象(stdClass 或自定义类),需用 (array)$obj 转换或反射读取 id。
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
深度合并对象属性(需逐个对象合并其内部字段)
这不是合并数组,而是合并“数组里的每个对象的属性”。此时推荐:
-
array_replace_recursive():对对象数组本身无效,但若你把对象转成数组(
json_decode(json_encode($obj), true)),再合并,最后转回对象 - 更安全做法:用
foreach遍历,对每个对象调用get_object_vars()+array_merge()或+合并属性,再用new \stdClass()或构造器重建
❌ 切勿直接对对象用 + 或 array_merge() —— 它们不作用于对象实例,会报错或静默失败。
去重合并(相同对象只留一个,但属性不丢失)
PHP 没有内置对象去重函数,但可通过 spl_object_hash() 唯一标识对象身份:
-
$seen = [];存哈希 foreach ($combined as $obj) { $hash = spl_object_hash($obj); if (!isset($seen[$hash])) { $result[] = $obj; $seen[$hash] = true; } }
✅ 保证同一对象实例不重复,所有属性自然保留;不同对象即使内容相同,也视为独立个体。


















