array_unique()用于去除一维数组重复值并保留首次出现的键,不重排索引、不支持多维数组,区分大小写;去重后需连续索引应配合array_values(),多维或复杂去重需手动实现。

PHP里用 array_unique() 最直接
想把普通数组变成“去重集合”,array_unique() 就是专干这事的函数,它会保留每个值第一次出现的键,删掉后续重复项。注意:它不改变原数组,而是返回新数组。
常见错误是以为它会自动重排索引——不会。array_unique() 保留原始键名,所以结果可能有空洞(比如 [0 => 'a', 2 => 'b'])。真要连续数字索引,得再套一层 array_values()。
- 只对值去重,不比较键;键类型不影响判断(
'1'和1被视为相同值) - 对多维数组无效,会报
Warning: array_unique(): Array not supported - 字符串比较默认区分大小写;如需忽略大小写,得先用
array_map('strtolower', $arr)预处理
多维数组去重得自己写逻辑
array_unique() 不支持多维数组,硬传进去会警告并返回空或意外结果。实际场景中,比如一堆用户数据(每个元素是 ['id' => 123, 'name' => 'Alice']),想按 id 去重,就得手动遍历 + isset() 或 in_array() 判断。
更高效的做法是用“值做键”的临时数组来判重:
$seen = [];
$unique = [];
foreach ($users as $item) {
if (!isset($seen[$item['id']])) {
$seen[$item['id']] = true;
$unique[] = $item;
}
}
这种写法时间复杂度 O(n),比嵌套 in_array() 的 O(n²) 稳定得多。如果要去重字段不是简单标量(比如想按整个子数组内容),得先 json_encode() 再当键用,但要注意浮点精度和顺序敏感问题。
去重后还要保持顺序?别用 array_flip() 反向操作
有人试过 array_flip(array_flip($arr)) 来去重,这确实能去重,但有个严重副作用:它会丢掉所有重复值中**最后一次**出现的那个,而不是第一次——因为 array_flip() 遇到重复值时,后出现的会覆盖前面的键。结果和 array_unique() 行为相反。
另外,array_flip() 要求原数组值必须是合法键(即整数或字符串),含 null、array、object 会警告并跳过,导致数据丢失。
- 想严格保持首次出现顺序 → 用
array_unique() - 想取最后一次出现的副本 → 得反转数组 →
array_unique()→ 再反转回来 - 值含非标量或不确定类型 → 别碰
array_flip(),老实用循环
性能和兼容性要注意这些点
array_unique() 在 PHP 7.2+ 对大数组做了优化,但若数组超 10 万项且值是长字符串,内存占用和耗时仍明显。这时候可考虑分块处理,或改用数据库 DISTINCT(如果数据源可查库)。
PHP 8.0+ 新增了 array_unique($arr, SORT_REGULAR) 第二个参数,默认就是 SORT_REGULAR,但显式写上更安全;旧版本不支持该参数,传了会报错。
- PHP set_time_limit(0) 防超时
- 值含浮点数时,
array_unique()比较的是原始二进制值,0.1 + 0.2 !== 0.3这类误差会导致“本该去重却没去成” - 从 JSON 解析来的数组,注意
null和"null"是不同值,不会被当成重复
去重看着简单,但值类型、顺序要求、性能边界、PHP 版本这几个变量一叠加,很容易漏掉一个就出错。动手前先确认清楚:你要去重的是什么类型、要不要保序、数据量大概多少。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











