在多维数组中查找子数组之间的公共值

时间:2011-01-16 06:37:44

标签: php arrays multidimensional-array

我有以下数组:

Array
(
    [0] => Array
        (
            [0] => 87
            [1] => 58
            [2] => 85
            [3] => 86
        )

    [1] => Array
        (
            [0] => 58
            [1] => 84
        )

    [2] => Array
        (
            [0] => 58
        )

)

上面的这个数组就是一个例子。实际的数组大小可变,但结构如下。基本上,我想在每个二级数组上运行array_intersect并获取它们之间常见的值(数字)。在这种情况下,它将是58

我不太清楚从哪里开始。有什么建议吗?

2 个答案:

答案 0 :(得分:12)

这对我有用:

function multi_intersect($arr) {
   $return = array();
   foreach ($arr as $a) {
       foreach ($arr as $b) {
           if ($a === $b) continue;
           $return = array_merge($return, array_intersect($a, $b));
       }
   }
   return array_unique($return);
}

应该得到你:

Array
(
    [0] => 58
)

如果您在至少两个子阵列中有一个公共号码,则上述步骤将起作用。

编辑后

如果要查找所有子数组中包含的数字,可以在call_user_func_array上使用array_intersect

$intersect = call_user_func_array('array_intersect', $arr);

答案 1 :(得分:0)

如果您的示例中存在错误,并且“root”数组的[0]元素中应该有58,那么您应该运行

$res = $arr[0]; foreach($arr as $elem) $res = array_intersect($res, $elem);

更通用的解决方案(嵌套数组):

<?php
//$arr -> your multidimensional array
function array_intersect_recursive($arr) {
  $first = true;
  foreach($arr as $elem) {
    if(is_array($elem)) $elem = array_intersect_recursive($arr);
    if($first) { $first = false; $res = $elem; } 
    else $res =  array_intersect($res, $elem);
  } 

}

我没有测试过,但我希望你明白这个想法。