PHP确定多维数组中数组之间的交集

Posted

技术标签:

【中文标题】PHP确定多维数组中数组之间的交集【英文标题】:PHP Determining intersection between arrays within multidimensional array 【发布时间】: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)

我该如何做到这一点?

【问题讨论】:

【参考方案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);
);

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

【讨论】:

以上是关于PHP确定多维数组中数组之间的交集的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中执行数组交集时如何保留多维数组信息?

在PHP中获取多维数组的交集

多维关联数组交集php

如何获得多个多维数组的所有可能交集?

在多维数组和单个数组之间存储数据的最有效方法是啥?

PHP 数组交集