最直接判断数组是否有重复值的方法是用array_unique()比较原数组与去重后数组的长度是否相等;若长度不等则存在重复。

用 array_unique() 比长度最直接
PHP 判断数组是否有重复值,最常用也最可靠的方式就是对比原数组和去重后的数组长度是否一致。因为 array_unique() 会保留第一个出现的键值对,去掉后续重复项,所以只要长度变短,就说明有重复。
注意:array_unique() 默认只比较值(value),不严格区分类型(比如 "1" 和 1 会被认为相同),如需严格类型检查,得加 SORT_REGULAR 以外的标志,但通常默认行为已够用。
- 示例:
$arr = [1, 2, 3, 2];<br>if (count($arr) !== count(array_unique($arr))) {<br> echo "有重复";<br>} - 对关联数组也有效,键名不影响判断逻辑
- 性能上,
array_unique()是 C 实现,比手写循环快得多,尤其数组较大时
用 array_count_values() 查具体哪些值重复了
如果不仅要判断“有没有”,还要知道“哪些值重复了”或“重复几次”,array_count_values() 更合适。它返回一个以原数组值为键、出现次数为值的新数组,之后遍历筛选出次数 > 1 的项即可。
限制:该函数要求原数组所有值都是字符串或数字,否则会警告并跳过非法项(比如 null、array、object)。
立即学习“PHP免费学习笔记(深入)”;
- 示例:
$counts = array_count_values($arr);<br>$duplicates = array_filter($counts, function($n) { return $n > 1; });<br>if (!empty($duplicates)) {<br> print_r(array_keys($duplicates)); // 输出重复的值<br>} - 注意:
array_count_values()不支持多维数组,嵌套结构需先扁平化或换方法 - 若只需布尔判断,用它比
array_unique()多一次遍历,稍慢,不推荐仅用于“有无”判断
手写循环适合特殊场景(比如要中断、带条件)
当需要在发现第一个重复时立刻退出、或重复判定逻辑复杂(如忽略大小写、按对象属性比),就不能依赖内置函数,得自己遍历。
关键点是用一个辅助数组(或 isset() 检查)做“已见值”记录,而不是两层 for 循环——后者时间复杂度 O(n²),容易卡住。
- 推荐写法:
$seen = [];<br>$hasDup = false;<br>foreach ($arr as $v) {<br> if (isset($seen[$v])) {<br> $hasDup = true;<br> break;<br> }<br> $seen[$v] = true;<br>} - 注意:
$v作为键时会被强制转为字符串或整数,所以1和"1"仍会冲突;如需保持类型,改用in_array($v, $seen, true),但性能略低 - 多维数组或对象数组必须自定义比较逻辑,无法直接用
isset()键查找
常见错误:误用 in_array() 嵌套遍历
有人写两层 foreach,外层取一个值,内层用 in_array($val, $arr, true) 查是否在剩余部分出现——这看似直观,实际是典型陷阱。
- 时间复杂度高:1000 个元素就要约 50 万次比较,线上接口可能超时
- 逻辑易错:没排除自身位置,导致每个值都“找到自己”,误判全重复
-
in_array()第三个参数设为true虽能避免"1" == 1问题,但无法解决性能瓶颈 - 真正需要“首次重复位置”等调试信息时,才考虑优化后的单次扫描,而非暴力嵌套
array_unique() + count();要统计频次就用 array_count_values();其他情况再动手写,且优先用哈希表(isset())而非搜索(in_array())。多维、对象、类型敏感这些边界,往往才是实际项目里卡住人的地方。



















