array_unique默认松散比较导致1、'1'、1.0被误判为重复,需加sort_regular参数;array_flip因键唯一性静默覆盖重复值;二者均不适用于多维数组或需类型严格区分的场景。

因为 array_unique 默认用松散比较,1 和 '1' 被当成同一个值,只留第一个;而 array_flip 遇到重复值会静默覆盖,只留最后一次出现的键值对。
array_unique 用 == 比较,类型转换导致误判
它内部按 == 规则判断相等:整数 1、字符串 '1'、浮点数 1.0 全部被转成字符串 "1" 再比,结果就是“去重过头”。
- 典型现象:
$arr = [1, '1', 2.0, '2']; array_unique($arr)返回只有两个元素,1和2 - 想严格区分类型?加
SORT_REGULAR参数:array_unique($arr, SORT_REGULAR) - 但注意:
SORT_REGULAR仍不解决多维数组问题,且对对象/资源无效
array_flip 因键唯一性强制覆盖,不是“删”而是“丢”
array_flip 不是去重函数,它是键值互换工具。当原数组值重复(比如 ['a'=>'x', 'b'=>'x']),反转后都试图设键为 'x',PHP 只保留最后赋值的那个 —— 'x' => 'b','a' 就没了。
- 不会报错、不发警告,行为完全静默
- 常见于构建反向映射表时:状态码 → 描述、字段名 → 标签,一不小心就漏数据
- 检测方法:
count($arr) !== count(array_unique($arr)),成立说明有重复值,不宜直接array_flip
多维数组直接喂给 array_unique 会出错或失效
array_unique 要求所有值能转成字符串参与哈希比较。遇到子数组、对象、资源时,PHP 会把它们统一转成字符串 "Array" 或 "Object",导致多个不同结构被当成相同值处理。
- 现象:
array_unique([['a'=>1], ['a'=>2]])可能返回只剩一个元素 - 临时解法:先
array_map('serialize', $arr),再array_unique,最后array_map('unserialize', ...) - 但要注意:序列化大数组开销高,且浮点数精度、闭包/资源无法序列化
真正容易被忽略的是:这两个函数的设计目标根本不是“安全去重”,而是“快速排重”。它们默认牺牲类型安全、结构完整性、错误提示来换性能。业务逻辑里一旦涉及用户输入、配置映射、状态反查,就得先问一句:值真的能无损转成键或字符串吗?
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











