贝利信息

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

日期:2025-12-30 00:00 / 作者:霞舞

本文介绍一种高效、简洁的方法,利用 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
        )
)

注意事项

此方法简洁、健壮且符合 PHP 的数组设计哲学,是处理此类“值→来源映射”问题的标准实践。