1

我有一个多维数组,其中包含三个数组和一个 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)

我该如何做到这一点?

4

4 回答 4

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));
于 2013-06-01T21:51:47.460 回答
2
$newArray = array_values(call_user_func_array("array_intersect", $data));

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

于 2013-06-01T21:41:11.547 回答
0

以下方法怎么样:

$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;

顺便说一句:适用于任何数量的 $data 除了 $data = null

于 2013-06-01T21:56:50.053 回答
0

解决这个问题的最简单方法是使用 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);
});

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

于 2013-06-01T22:08:45.237 回答