You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP:校验多维数组二级键值是否存在于所有父级数组

问题描述

现有一个多维数组,需编写代码校验所有数值,找出在所有父级键对应同一二级键的子数组中都存在的数值,并返回按二级键分组的结果。其中父级键visitPoints、islands、animals始终存在(有时可能为空),二级键及对应内容是动态变化的。

示例数组:

$array = [
    'visitPoints'=>[
        20=>[2,5,6,8,10,11],
        35=>[2,5,6],
        57=>[1],
    ],
    'islands'=>[
        20=>[5,10,11],
        35=>[5,6]
    ],
    'animals'=>[
        20=>[5,11],
        35=>[]
    ]
];

期望结果:

$result = [
    20=>[5,11],
    35=>[],
    57=>[]
];

此前尝试使用call_user_func_array('array_intersect', $array)实现,但未得到预期结果。

解决方案

核心思路是:针对每个二级键,收集所有父级下该键对应的子数组,再计算这些子数组的交集。具体实现代码如下:

$array = [
    'visitPoints'=>[
        20=>[2,5,6,8,10,11],
        35=>[2,5,6],
        57=>[1],
    ],
    'islands'=>[
        20=>[5,10,11],
        35=>[5,6]
    ],
    'animals'=>[
        20=>[5,11],
        35=>[]
    ]
];

// 收集所有出现过的二级键,避免遗漏
$allSecondaryKeys = [];
foreach ($array as $parentData) {
    $allSecondaryKeys = array_merge($allSecondaryKeys, array_keys($parentData));
}
$allSecondaryKeys = array_unique($allSecondaryKeys);
sort($allSecondaryKeys);

$result = [];
foreach ($allSecondaryKeys as $secondaryKey) {
    // 收集每个父级下当前二级键对应的子数组,不存在则用空数组替代
    $subArrays = [];
    foreach ($array as $parentData) {
        $subArrays[] = $parentData[$secondaryKey] ?? [];
    }

    // 逐步计算数组交集,为空时提前终止循环
    $intersection = $subArrays[0];
    foreach (array_slice($subArrays, 1) as $sub) {
        $intersection = array_intersect($intersection, $sub);
        if (empty($intersection)) break;
    }

    // 重置数组索引,保证结果格式统一
    $result[$secondaryKey] = array_values($intersection);
}

print_r($result);

代码说明

  1. 收集二级键:遍历所有父级数组,收集所有出现过的二级键并去重,确保不会遗漏仅在单个父级中存在的键(如示例中的57)。
  2. 收集子数组:对每个二级键,从所有父级中取出对应的子数组,若父级中无该键则用空数组代替。
  3. 计算交集:依次计算多个子数组的交集,一旦交集为空就提前停止循环,提升执行效率。
  4. 重置索引:将交集数组的索引重置为连续数字,保证结果格式与示例一致。

内容的提问来源于stack exchange,提问作者Ered

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:26:08