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

PHP 中“对象数组”本身是普通数组,只是元素为对象。合并两个对象数组(即两个包含对象的索引数组),**默认不涉及对象属性的自动合并**——对象各自保持完整,关键在于你希望如何组织这些对象:是简单拼接?还是按某个键去重/补全?还是逐个合并对象内部属性? 下面分几种典型场景说明,重点讲清 **如何保留各自属性不丢失、不覆盖、不误改**:
直接拼接对象数组(最常用,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。
深度合并对象属性(需逐个对象合并其内部字段)
这不是合并数组,而是合并“数组里的每个对象的属性”。此时推荐:
修复 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; } }
✅ 保证同一对象实例不重复,所有属性自然保留;不同对象即使内容相同,也视为独立个体。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










