【问题标题】:PHP Determining intersection between arrays within multidimensional arrayPHP确定多维数组中数组之间的交集
【发布时间】:2013-06-01 21:38:33
【问题描述】:

我有一个多维数组,其中包含三个数组和一个 id 数组。这是它的样子:

$data = array(
    'first' => array(1,2,3,4,5,6),
    'second' => array(1,2,3),
    'third' => array(1,2,5,6)
);

我想做的是在所有三个上运行一个交集并最终得到一个数组的结果,在这个例子中,将是array(1,2)

我该如何做到这一点?

【问题讨论】:

    标签: php arrays intersection array-intersect


    【解决方案1】:
    $newArray = array_values(call_user_func_array("array_intersect", $data));
    

    array_intersect 返回所有传递的数组的相同值,因此您可以将$data 的条目作为参数传递给它。重新索引需要array_values,因为键不会更改(不是必需的,但在for 循环中使用结果数组时很有帮助)。

    【讨论】:

      【解决方案2】:

      使用array_reducearray_intersect

      $v = array_values($data);
      $r = array_slice($v, 1);
      $result = array_reduce($r, 'array_intersect', $v[0]);
      var_dump($result);
      

      这里是单线。

      array_reduce(array_slice($data, 0, -1), 'array_intersect', end($data));
      

      【讨论】:

      • @raina 给你。添加了一条线
      • 我看到了,好的。 ) 不过,我还没有看到这比使用 call_user_func_array 更好。
      • @shiplu.mokadd.im 不错的解决方案,但遗憾的是 array_reduce 在这里需要一个初始值。这减少了解决方案的美感......
      • @shiplu.mokadd.im 但 array_slice 是不必要的,因为与同一个数组的交集不会改变任何东西。
      • @bwoebi 它不会改变结果。但它会对相同的元素执行两次array_intersect。使用array_slice 可以防止这种情况发生。
      【解决方案3】:

      下面的方法怎么样:

      $comp = null;
      foreach ($data as $arr) {
        if ($comp === null) {
          $comp = $arr;
          continue;
        } else {
          $comp = array_intersect($comp, $arr);
        }
      }
      //$comp no contains all the unique values;
      

      btw:适用于任何数量的 $data,除了 $data = null

      【讨论】:

        【解决方案4】:

        解决这个问题的最简单方法是使用 array_reduce:

        function process($result, $item) {
            return is_null($result) ? $item : array_intersect($result, $item);
        }
        $result = array_reduce($data, 'process');
        

        或者像这样使用带有匿名函数的array_reduce:

        $result = array_reduce($data, function($result, $item) {
            return is_null($result) ? $item : array_intersect($result, $item);
        });
        

        最后一个解决方案的优点是不需要使用包含函数名称的字符串来引用函数(内置或其他)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-14
          • 1970-01-01
          • 1970-01-01
          • 2011-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多