查找PHP数组重复元素最常用方法是array_count_values()配合array_filter(),可高效提取重复值并自动去重;手动遍历适用于需记录位置、保留顺序或处理非标量数据的场景。

要查找 PHP 数组中的重复元素,核心思路是统计每个值的出现次数,再筛选出频次大于 1 的项。最常用、高效且易懂的方法是利用 array_count_values() 配合 array_filter()。
用 array_count_values + array_filter 快速提取重复值
array_count_values() 会返回一个以原数组值为键、出现次数为值的新数组;再用 array_filter() 筛出次数 > 1 的项,最后用 array_keys() 取出重复的值本身。
- 代码简洁,一行逻辑清晰:
$duplicates = array_keys(array_filter(array_count_values($arr), fn($count) => $count > 1)); - 自动去重:结果中每个重复值只出现一次,比如
[1,2,2,3,3,3]返回[2,3] - 仅适用于键值均为标量(int/string)的数组;含数组、对象会报错
手动遍历 + 关联标记(适合自定义逻辑或复杂场景)
当需要记录重复元素的位置、保留原始顺序、或处理非标量数据时,可手动遍历并用辅助数组记录已见值。
- 初始化空数组
$seen = [];和$duplicates = []; - 循环原数组,对每个值
$v:若isset($seen[$v])为真且$v尚未加入$duplicates,就追加进去;否则设$seen[$v] = true - 优点:可控性强,可扩展(如同时存索引
$seen[$v][] = $key) - 注意:同样要求
$v是合法的数组键(不能是数组或对象)
处理关联数组或需保留首次/末次出现索引的情况
如果题目要求返回重复值及其所有出现位置(如面试题进阶),就不能只靠 array_count_values。
立即学习“PHP免费学习笔记(深入)”;
- 遍历带键的数组:
foreach ($arr as $key => $value) - 用
$map[$value][] = $key收集每个值对应的所有键 - 再遍历
$map,挑出count($positions) > 1的项,即可得到值 + 全部索引 - 这样既支持字符串键,也兼容数值键,且不依赖值是否可做键(只要在循环中能比较即可)
注意事项与边界情况
实际写代码时容易忽略这些细节:
- null、false、0、空字符串在松散比较下可能被误判为相同——必要时用严格比较或先类型标准化
- 大小写敏感:'A' 和 'a' 默认算不同元素;如需忽略,统一转小写再处理
- 浮点数精度问题:直接用作键可能出错,建议四舍五入或转字符串后再统计
- 大数组性能:
array_count_values时间复杂度 O(n),空间也是 O(n),一般够用;超百万级可考虑分块或迭代器优化











