array_unique() 默认用松散比较(==)导致1和'1'等被误判重复,需显式传sort_regular实现严格比较(===);它不保证键顺序,多维数组需手动处理。

array_unique() 默认就保留第一个出现的元素,不需要额外配置。
但很多人实际用的时候发现“没保留第一个”,根本原因不是函数失效,而是没看清它怎么判断“重复”。
为什么 array_unique() 看似没保留第一个?
它内部用的是松散比较(==),不是严格比较(===)。这意味着:
-
1和'1'被视为相同 → 后者被剔除 -
true、1、'1'都算重复 -
0、false、''、null也可能被归为一类
比如:$arr = [1, '1', 2, '2']; print_r(array_unique($arr)); 输出只有两个元素,因为 1 和 '1' 冲突了。
想真正按“值+类型”保留第一个,必须传 SORT_REGULAR
这个标志强制使用 === 级别的比较逻辑,避免类型隐式转换干扰:
$arr = [1, '1', 2, '2']; $result = array_unique($arr, SORT_REGULAR); // 输出: [1 => '1', 2 => 2, 3 => '2']?不对 —— 实际是 [0 => 1, 1 => '1', 2 => 2, 3 => '2'] // 因为 1 ≠ '1'(类型不同),所以全部保留
注意:SORT_REGULAR 是 PHP 默认行为(从 7.2 起),但显式写出更安全,尤其在老项目或不确定环境里。
关联数组去重时键名保留,但顺序可能“错乱”
array_unique() 不保证返回数组的键顺序和原始遍历顺序一致。它的实现先转字符串排序再去重,所以:
- 索引数组(数字键):基本保持原序,但键号会跳(如
[0] => a, [2] => b) - 关联数组(字符串键):键名保留,但顺序取决于内部哈希表行为,PHP 8+ 更稳定,但不承诺“首次出现位置即输出位置”
- 如果必须按原始插入顺序返回唯一值,且要连续数字键,得补一句:
array_values(array_unique($arr))
多维数组不能直接用 array_unique()
它只对一维标量值有效。遇到二维数组(比如用户列表),直接调用会报 Notice: Array to string conversion,结果全变成 'Array' 然后只剩一个元素。
正确做法是自己写逻辑,常见模式:
- 按某个字段去重(如
user_id):用foreach+in_array或isset($seen[$item['user_id']])判断 - 全量结构对比去重:需
serialize($item)作临时 hash 键,但要注意浮点精度、对象不可序列化等问题 - PHP 5.2.9+ 声称支持多维,实测仍不稳定,不建议依赖
最稳妥的写法还是手动遍历 + 哈希标记,控制权在你手上。
关键点在于:保留“第一个”不是靠技巧,而是靠理解array_unique() 的比较规则和适用边界。类型混用、多维结构、顺序敏感场景,都容易让它“看起来没生效”。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











