array_unique通过哈希表键唯一性去重,将元素转字符串作键插入,冲突则丢弃,保持首次出现顺序;类型转换导致0、"0"、false、""等被误判相同;时间复杂度o(n),优于in_array的o(n²)。

array_unique 并不直接比较元素值,而是依赖 PHP 内部的哈希表(HashTable)机制实现去重:它把每个元素作为键(key)存入临时哈希表,利用“键唯一”特性自动过滤重复项,再将键重新转为值返回。
去重本质是“键冲突丢弃”
PHP 数组底层是哈希表,键必须唯一。array_unique 会遍历原数组,尝试将每个元素(经类型转换后)作为字符串键插入临时哈希表:
- 若该键已存在,新值被忽略(不覆盖也不报错)
- 若键不存在,则插入成功,对应原数组该位置的值被保留
- 最终遍历哈希表的键,按插入顺序重建索引数组(保持首次出现位置)
类型转换影响去重结果
array_unique 对非字符串/数字类型会强制转为字符串再哈希,这导致一些隐式等价被合并:
Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的
- 0 == "0" == false == "" → 这四个值在去重时视为相同
- 1 == true、-0 == 0 等也会触发意外合并
- 如需严格区分类型,应先用 array_map('strval', $arr) 或自定义比较逻辑
性能取决于哈希效率,而非两两比较
时间复杂度接近 O(n),不是 O(n²):
立即学习“PHP免费学习笔记(深入)”;
- 每次键插入平均耗时 O(1),总开销主要来自哈希计算和内存分配
- 大数据量下瓶颈通常是内存(临时哈希表 + 结果数组)而非 CPU
- 比手写 foreach + in_array(O(n²))快一个数量级,尤其当 n > 1000 时优势明显
替代方案需权衡场景
若需严格类型安全或自定义规则,不要硬套 array_unique:
- 多维数组去重:用 json_encode 转字符串再 unique,但注意浮点精度和键序问题
- 对象去重:需实现 __toString 或用 spl_object_id 作键
- 按字段去重(如用户数组按 email 去重):用 array_column + array_keys + array_intersect_key 组合更可控










