php 8.0 中找数组重复数字首选 array_count_values() 筛选,简洁高效;需首个重复项时用单次遍历+哈希标记;仅判断存在性可用 array_unique() 比长度。

在 PHP 8.0 中找出数组中重复的数字,核心在于高效识别并返回至少出现两次的数值。推荐优先使用 array_count_values() 配合筛选,兼顾可读性与性能;若需严格区分“首次重复出现的位置”或处理超大数组,再考虑手动遍历 + 哈希表缓存。
方法一:用 array_count_values() 统计后筛选
这是最简洁、符合 PHP 特性的做法,适合大多数场景(如面试题、业务逻辑校验):
- 原理:将数组值作为键,出现次数作为值,生成频次映射表
-
操作:过滤出次数 ≥ 2 的键,用
array_keys()提取数字本身 - 注意:结果不保留原始顺序;若需去重后的重复数字列表,直接返回即可
$nums = [1, 3, 2, 4, 3, 5, 2]; $counts = array_count_values($nums); $duplicates = array_keys(array_filter($counts, fn($v) => $v >= 2)); // $duplicates = [3, 2]
方法二:单次遍历 + 关联数组标记(适合找第一个重复项)
当题目要求“返回第一个重复出现的数字”(即第二次出现时立刻返回),该方法时间复杂度 O(n),空间 O(n),且可提前终止:
-
关键点:用空数组作哈希表,键为数字,值设为
true表示已见过 - 逻辑:遍历时检查当前数字是否已在标记数组中存在,存在即返回并 break
- PHP 8.0 优势:支持箭头函数和联合类型提示,可写得更严谨
function findFirstDuplicate(array $nums): int|null {
$seen = [];
foreach ($nums as $num) {
if (isset($seen[$num])) {
return $num;
}
$seen[$num] = true;
}
return null;
}
// findFirstDuplicate([1, 3, 2, 4, 3, 5]) → 3
方法三:使用 array_unique() 对比长度(仅判断是否存在重复)
如果只需布尔判断“数组是否有重复数字”,无需具体数值,这是最轻量的方式:
- 原理:去重后数组长度变小,说明原数组存在重复
-
写法:
count($arr) !== count(array_unique($arr)) -
限制:不返回重复值,也不适用于含字符串或 null 的混合数组(需配合
SORT_REGULAR)
避坑提醒(PHP 8.0 特别注意)
- 避免用
in_array()嵌套循环——O(n²) 效率低,PHP 8.0 下更明显 - 数字字符串如
"1"和整数1在默认比较下视为相同,如需严格类型区分,用===并统一类型转换 - 空数组或单元素数组直接返回空结果,无需额外判断
- 使用
array_filter()时,PHP 8.0 默认保留键名,如需重排索引,外层套array_values()
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











