最简单可靠的方式是用array_values()配合array_unique();默认松散比较,传SORT_REGULAR可严格区分类型;关联数组按值去重并保留首键;多维或自定义规则需手动遍历+哈希表优化性能。

PHP 数组去重并保留原始顺序,最简单可靠的方式是使用 array_values() 配合 array_unique()。
基础用法:索引数组去重保序
array_unique() 默认会保留第一个出现的键值对,并移除后续重复项,同时保持原有键名;但键名可能不连续。若需重新索引为 0 开始的连续数字键,再套一层 array_values() 即可。
-
注意:该函数对字符串和整数敏感(
"1"和1视为不同),默认使用松散比较 - 如需严格比较(区分类型),传入
SORT_REGULAR第二个参数(PHP 7.2+ 支持) - 示例:
$arr = [1, '1', 2, 1]; print_r(array_values(array_unique($arr, SORT_REGULAR)));→[1, '1', 2]
关联数组按值去重(保留首次出现的键)
当数组含自定义键(如 ['a'=>1, 'b'=>2, 'c'=>1]),array_unique() 仍按值去重,并保留第一个对应键(即 'a'),后续相同值的键(如 'c')被丢弃。
- 结果中键名不变,若需重排索引,仍需
array_values() - 若希望按“键”去重(而非值),需自行遍历判断,不属于
array_unique范畴
自定义逻辑去重(如忽略大小写、多维数组)
原生函数不支持多维数组或复杂规则,此时需手动遍历:
立即学习“PHP免费学习笔记(深入)”;
- 维护一个已见值的集合(如
$seen = []),用in_array()或isset($seen[$normalized])判断 - 对字符串统一转小写再比较:
$key = strtolower($item) - 对多维数组可用
serialize($item)生成唯一标识(注意性能与资源开销) - 示例片段:
$unique = []; $seen = []; foreach ($arr as $item) { $k = serialize($item); if (!isset($seen[$k])) { $seen[$k] = true; $unique[] = $item; } }
性能与边界提醒
小数组直接用 array_unique() 最简洁;大数据量时注意内存(尤其 serialize 多维项)和时间复杂度。
-
array_unique()时间复杂度约为 O(n²),内部做了类似嵌套循环的比较 - 用哈希表(如
$seen数组)手动实现可达 O(n),推荐用于高频或大数组场景 - 空数组、全重复数组等边界情况均能正常处理,无需额外判断











