PHP 7.4 中合并去重需按数据结构选择策略:一维标量用 array_merge + array_unique(SORT_REGULAR) + array_values;关联数组慎用 array_merge,优先用 + 运算符或提取值后去重;多维数组须按主键分组并深度合并;对象数组应基于 spl_object_id 去重。

合并多个数组并去重,在 PHP 7.4 中最常用、最稳妥的方式是 先合并再统一去重,但必须根据数据结构类型(一维/多维/关联/对象)选择对应策略。盲目套用 array_unique(array_merge(...)) 容易漏掉类型隐式转换、键名丢失、嵌套内容被忽略等问题。
一维数值或字符串数组:直接 array_unique + array_merge
适用于纯标量值(如 ID 列表、分类标签、状态码等),无嵌套、无对象:
- 用
array_merge(...$arrays)合并所有数组(PHP 5.6+ 支持展开运算符) - 立即传给
array_unique(..., SORT_REGULAR),避免"1"和1被误判为重复 - 若需连续数字索引,再套一层
array_values()
示例:
```php$a = [1, 2, '3'];
$b = [2, '3', 4];
$c = ['3', 4, 5];
$merged = array_merge($a, $b, $c); // [1,2,'3',2,'3',4,'3',4,5]
$unique = array_values(array_unique($merged, SORT_REGULAR)); // [1,2,'3',4,5]
```
含字符串键的关联数组:慎用 array_merge,优先用 + 或自定义合并
array_merge 会覆盖同名字符串键(后值覆盖前值),而 + 运算符保留首个出现的键值——这对“去重优先保留原始来源”更安全:
立即学习“PHP免费学习笔记(深入)”;
- 若各数组 key 语义一致(如都表示配置项),用
$result = $a + $b + $c;即可天然避免重复键覆盖 - 若需按值去重(而非按键),必须先提取值(如
array_values()),再走一维去重流程 - 不建议对关联数组直接
array_unique,它只比较值,不感知键结构,且会打乱原有键顺序
多维数组(如带 id 的记录列表):不能靠 array_unique,必须按 ID 分组 + 深度合并
当多个数组里有相同 id 但字段互补(如 providerDetails、tags、status),array_unique 完全无效——它只会剔除完全相同的整行,不会聚合逻辑同一实体:
- 先用
foreach遍历所有数组,以$item['id']为键归类到临时分组数组 - 对每个分组内的元素执行深度合并:
name留首条,categories合并去重,providerDetails递归合并 - PHP 7.4 不支持
array_merge_recursive的智能覆盖逻辑,需手动实现字段级策略(如用array_replace_recursive或自定义函数)
关键点:这不是“去重”,而是“基于主键的智能聚合”。强行用 array_unique 只会让数据变少、信息丢失。
对象数组:不能直接 array_unique,需提取唯一标识
array_unique 对对象只做 == 比较,无法识别实例身份;PHP 7.4 支持 spl_object_id(),这是稳定可靠的去重依据:
- 遍历数组,用
spl_object_id($obj)获取唯一整数 ID - 维护一个已见 ID 数组,跳过重复 ID 对应的对象
- 若对象无唯一业务字段(如
$obj->id),又需按内容去重,则需serialize($obj)后 hash 比较(注意性能)
示例片段:
```php$seen = [];
$filtered = array_filter($objects, function($obj) use (&$seen) {
$id = spl_object_id($obj);
if (in_array($id, $seen)) return false;
$seen[] = $id;
return true;
});
```



















