最直接有效的方式是用 count($arr) !== count(array_unique($arr)) 判断——只要长度不等,就说明存在重复元素;推荐用于通用场景,支持所有类型数组,但默认松散比较。

最直接有效的方式是用 count($arr) !== count(array_unique($arr)) 判断——只要长度不等,就说明存在重复元素。
用 array_unique 比长度(推荐)
这是最常用、性能好、代码简洁的方法。array_unique 会移除重复值并保留首次出现的键,去重后若数组变短,即存在重复。
- 对所有类型数组都适用(字符串、数字、甚至部分对象序列化后)
- 注意默认是松散比较:
"1"和1被视为相同 - 如需严格类型区分,可先序列化:
count($arr) !== count(array_unique(array_map('serialize', $arr)))
用 array_count_values 查重复值(需定位具体元素)
当你不仅想知道“有没有重复”,还想找出“哪些值重复了”,这个函数最合适。它返回一个以原数组值为键、出现次数为值的统计数组。
- 仅支持字符串和整数作为原数组的值;含数组、对象、null 会报错或结果不可靠
- 示例:获取所有重复值
$dups = array_keys(array_filter(array_count_values($arr), fn($n) => $n > 1)); - 若
$dups非空,就明确知道哪些值重复、重复几次
用 foreach + in_array 手动检查(适合小数组或调试)
逻辑清晰,可控性强,适合需要记录首次重复位置、或做额外判断(如忽略大小写)的场景。
立即学习“PHP免费学习笔记(深入)”;
- 时间复杂度 O(n²),大数据量时不建议
- 可加第三个参数
true启用严格比较:in_array($val, $seen, true) - 典型结构:
$seen = []; foreach ($arr as $v) { if (in_array($v, $seen)) { return true; } $seen[] = $v; }
用 array_flip 检测键冲突(轻量但有局限)
利用“键名必须唯一”的特性:翻转一次把值变键,再翻转回来,如果结果与原数组不完全相等(===),说明原数组有重复值。
- 仅适用于值为字符串或整数的数组;其他类型会被强制转换,可能误判
- 会丢失原始键名,且无法告诉你哪个值重复,只返回“是/否”
- 写法简短:
$noDup = ($arr === array_flip(array_flip($arr)));



















