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);
代码说明
- 收集二级键:遍历所有父级数组,收集所有出现过的二级键并去重,确保不会遗漏仅在单个父级中存在的键(如示例中的
57)。 - 收集子数组:对每个二级键,从所有父级中取出对应的子数组,若父级中无该键则用空数组代替。
- 计算交集:依次计算多个子数组的交集,一旦交集为空就提前停止循环,提升执行效率。
- 重置索引:将交集数组的索引重置为连续数字,保证结果格式与示例一致。
内容的提问来源于stack exchange,提问作者Ered
相关产品推荐
相关产品推荐

