如何在 PHP 多维数组中查找跨多个子数组重复出现的值

本文介绍一种高效、简洁的方法,利用 php 的键值映射特性,统计多维数组中每个值出现的子数组名称,从而快速识别在两个或以上子数组中重复出现的元素。

要解决“找出在多个子数组中重复出现的值,并记录其所属子数组名”这一需求,关键在于反转数据结构视角:不采用暴力嵌套循环逐个比对,而是以值为键、以子数组名为值进行累积归集。

核心思路

遍历外层数组,对每个子数组中的每个元素,将其作为新数组 $result 的键,将当前子数组的键名(如 'arr1')追加到该键对应的数组中。PHP 的 []= 语法天然支持动态构建索引数组,无需预先初始化。

实现代码

$input = [
    'arr1' => ['JAN2016', 'MAI2013', 'JUN2014'],
    'arr2' => ['APR2016', 'DEC2013', 'JUN2014'],
    'arr3' => ['JAN2016', 'MAI2025', 'JUN2025'],
];

$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 的数组设计哲学,是处理此类“值→来源映射”问题的标准实践。