array_unique()仅对一维数组值去重且默认字符串比较,二维数组无效;需手动按字段(如attr_id)遍历+seen键查重;array_flip组合法仅适用于无歧义的标量一维数组。

可以,但不能靠单个函数一步到位;array_merge() 和 array_unique() 必须配合使用,且顺序和参数类型必须对得上——否则去重会失败或键被意外重置。
array_merge() 合并后直接跟 array_unique() 为什么有时不生效?
因为 array_unique() 只对一维数组的「值」去重,且默认用 string 比较规则。如果合并后是二维数组(比如一堆关联子数组),array_unique($arr) 会直接返回原数组,不报错也不去重——PHP 把每个子数组当作不可比较的 array 类型,跳过判断。
- 一维数值数组:✅ 安全可用,如
array_unique(array_merge([1,2], [2,3]))→[1,2,3] - 一维字符串键数组:⚠️ 值去重成功,但键会被重置为数字索引(除非加
SORT_REGULAR以外的 flag) - 二维/多维数组:❌ 无效,
array_unique()不递归,也不支持指定字段去重
二维数组按指定字段(如 id)合并去重怎么写?
核心思路是:先合并,再用临时键暂存已见的唯一标识,边遍历边剔除重复项。不能依赖 array_unique(),得手动控制逻辑。
例如按 attr_id 去重:
$merged = array_merge($arr1, $arr2);
$seen = [];
$result = [];
foreach ($merged as $item) {
$key = $item['attr_id'] ?? null;
if ($key !== null && !isset($seen[$key])) {
$seen[$key] = true;
$result[] = $item;
}
}
- 用
$seen数组做 O(1) 查重,比in_array()遍历快得多 -
?? null防止键不存在导致 notice;!isset($seen[$key])比!array_key_exists()更轻量 - 如果要保留原始键(如
'1111' => [...]),把$result[] = $item换成$result[$key] = $item
想用 array_flip + array_keys 组合去重,要注意什么?
这个技巧只适用于「纯值去重的一维数组」,本质是利用键的唯一性:array_keys(array_flip($a) + array_flip($b))。但它有硬伤:
- 所有值会被强制转为字符串——
0、false、''全变成'',冲突丢数据 - 无法处理
null、数组、对象等非标量值,array_flip()会警告并跳过 - 合并时用
+运算符,不是array_merge(),语义不同(后者重索引,前者保左)
所以它适合简单标签列表、ID 列表这类确定无歧义的字符串/整数场景,别碰用户输入或混合类型数据。
真正容易被忽略的是:去重逻辑必须和业务唯一性定义对齐。按 id 去重?按 name 和 type 联合去重?还是按序列化后的完整结构?选错维度,代码跑得再快也没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











