array_unique去重“失效”实为行为预期不符:因强制字符串转换致0/"0"/false等误判重复;不支持多维数组而转为"array"全等;sort_locale_string未配locale时中文比较异常;保留键名造成视觉混淆;超大数组在旧版或内存不足时可能退化。

PHP 的 array_unique 去重“失效”,通常不是函数本身坏了,而是它在特定场景下行为不符合预期——表面没报错、也返回了数组,但重复项还在,或结果混乱。常见于以下几类情况:
值被强制转为字符串后意外相等
该函数底层按 (string)$a === (string)$b 判断是否重复。这意味着:
-
数字与字符串混用:如
0、"0"、false、""、null在强转字符串后都变成""或"0",被当作相同值去重 -
浮点数精度问题:例如
1.0和1转成字符串都是"1",会被判重复 -
对象或数组直接传入:PHP 将其统一转为字符串
"Array"或"Object",所有对象/数组全变成同一个字符串,导致整个数组看似“没去重”(实际是全被当成重复,只留第一个)
二维或多维数组直接调用 array_unique
该函数**不支持多维数组**。对二维数组如 [['id'=>1], ['id'=>1]] 调用 array_unique($arr) 会触发警告:
并原样返回输入数组——看起来完全没去重。因为每个子数组都被转成字符串 "Array",全部判定为相同,函数无法继续比较,直接退出。
使用 SORT_LOCALE_STRING 但 locale 未正确设置
这个 flag 只在 setlocale(LC_COLLATE, 'xxx') 成功设置对应本地化环境后才生效。若没设或设错(比如写成 'zh_CN' 却没 UTF-8 后缀),排序和比较仍走默认规则,中文、带重音字母等可能无法正确区分,造成“该去的没去”。
键名保留导致误判“没去重”
array_unique 默认保留原始键名,不去动键。例如:
$arr = ['a'=>1, 'b'=>2, 'c'=>1];<br>$res = array_unique($arr); // 结果是 ['a'=>1, 'b'=>2]
如果你后续用 foreach ($res as $v) 遍历,发现只有两个值,是对的;但若你用 array_values($res) 之后再对比原数组长度,或依赖数字键顺序做逻辑,就容易以为“怎么还剩两个 1?”——其实它已正确剔除了第二个 1(键 c),只是键名没变,视觉上不直观。
大数组超出内部限制(少见但存在)
有历史报告指出,在极老版本或特定内存配置下,array_unique 对超大数组(如数百万元素)可能因哈希表扩容失败而退化,表现类似“失效”。不过 PHP 7.2+ 已大幅优化,当前主流版本中更可能是内存不足或超时中断,而非函数逻辑失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











