
本文介绍一种高效、简洁的方法,利用 php 的键值映射特性,统计多维数组中每个值出现的子数组名称,从而快速识别在两个或以上子数组中重复出现的元素。
要解决“找出在多个子数组中重复出现的值,并记录其所属子数组名”这一需求,关键在于反转数据结构视角:不采用暴力嵌套循环逐个比对,而是以值为键、以子数组名为值进行累积归集。
核心思路
遍历外层数组,对每个子数组中的每个元素,将其作为新数组 $result 的键,将当前子数组的键名(如 'arr1')追加到该键对应的数组中。PHP 的 []= 语法天然支持动态构建索引数组,无需预先初始化。
实现代码
$input = [
'arr1' => ['JAN2016', 'MAI2013', 'JUN2014'],
'arr2' => ['APR2016', 'DEC2013', 'JUN2014'],
'arr3' => ['JAN2016', 'MAI2020', 'JUN2022'],
];
$result = [];
foreach ($input as $subKey => $values) {
foreach ($values as $value) {
$result[$value][] = $subKey;
}
}
// 过滤:仅保留出现次数 ≥ 2 的项(即跨至少两个子数组)
$duplicates = array_filter($result, fn($subArray) => count($subArray) >= 2);
print_r($duplicates);输出结果:
Array
(
[JAN2016] => Array
(
[0] => arr1
[1] => arr3
)
[JUN2014] => Array
(
[0] => arr1
[1] => arr2
)
)注意事项
- ✅ 时间复杂度为 O(n),其中 n 是所有子数组元素总数,远优于嵌套比对的 O(n²);
- ✅ 自动去重:相同值在同一个子数组内重复出现时,会多次记录同一子数组名(如 'arr1' 出现两次),若需严格“跨子数组”去重,可先对各子数组调用 array_unique();
- ⚠️ 若输入含非标量值(如数组、对象),将触发 PHP 警告(因无法作为键),请确保待查值为字符串或数字;
- ? 如需进一步获取重复频次,可用 count($result[$value]) 直接读取。
此方法简洁、健壮且符合 PHP 的数组设计哲学,是处理此类“值→来源映射”问题的标准实践。
立即学习“PHP免费学习笔记(深入)”;











