PHP数组去重最常用的是array_unique(),手写推荐哈希表标记法(O(n)),基础双循环仅用于教学,关联数组需保留首次键名,多维数组需序列化处理。

PHP 数组去重最常用、最高效的方式是直接使用内置函数 array_unique(),但面试或实战中常要求手写逻辑,考察对数组结构、遍历方式和哈希思想的理解。下面从基础到进阶,给出几种典型实现及适用场景。
基础双循环去重(适合小数组、教学理解)
通过外层遍历每个元素,内层检查该元素是否在前面已出现过。时间复杂度 O(n²),仅建议用于学习原理或极小数据量(如 ≤100 项)。
- 用一个新数组 $result 存放不重复项
- 对原数组每项 $arr[$i],遍历 $result 判断是否已存在
- 不存在则追加:$result[] = $arr[$i]
哈希表标记法(推荐手写方案,O(n) 时间)
利用 PHP 数组本身是哈希表的特性,用键(key)记录已出现的值,避免重复插入。支持字符串、数字,对关联数组需注意键值分离。
- 初始化空数组 $seen = [] 和 $result = []
- 遍历原数组:若 $seen[$val] 未设置,则 $seen[$val] = true 且 $result[] = $val
- 注意:若原数组含非标量值(如数组、对象),会报错,需先用 serialize() 处理
保留首次出现键名的关联数组去重
当原数组是关联数组(如 ['a'=>1, 'b'=>2, 'c'=>1]),且希望保留第一个键(如 'a' 而非 'c')时,不能只看值,还要记录键。
立即学习“PHP免费学习笔记(深入)”;
- 遍历 $arr 使用 foreach ($arr as $key => $val)
- 用 $seen[$val] 存储首次出现的 $key,同时 $result[$key] = $val
- 后续遇到相同 $val 时跳过,不覆盖 $result
多维数组去重(需序列化 + 哈希)
PHP 不支持直接对多维数组使用 array_unique(默认只比较第一层),需先序列化子数组为字符串再去重。
- $serialized = array_map('serialize', $arr)
- $unique_serialized = array_unique($serialized)
- $result = array_map('unserialize', $unique_serialized)
- 注意:serialize 对闭包、资源等无效,仅适用于纯数据数组
实际开发优先用 array_unique,并根据需求选参数(如 SORT_STRING 或 SORT_NUMERIC);手写实现重在理解“以空间换时间”的哈希思路,关键在于明确去重依据(值?键值对?顺序?)和数据类型边界。










