我有一个多维数组,其中包含三个数组和一个 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)
我该如何做到这一点?
我有一个多维数组,其中包含三个数组和一个 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)
我该如何做到这一点?
使用array_reduce
和array_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));
$newArray = array_values(call_user_func_array("array_intersect", $data));
array_intersect
返回传递的所有数组的相同值,因此您可以将 的条目$data
作为参数传递给它。array_values
需要重新索引,因为键不会更改(不是必需的,但在for
循环中使用结果数组时很有用)。
以下方法怎么样:
$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
解决这个问题的最简单方法是使用 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);
});
最后一个解决方案的优点是不需要使用包含函数名称的字符串来引用函数(内置或其他)。