我有两个数组:
$arr1 = array('a' => 10, 'b' => 20);
$arr2 = array('a' => 10, 'b' => 20, 'c' => 30);
如何使用array_filter()
从$arr1
中不存在的元素中删除$arr2
?就像我示例中的"c"一样。
有一个专门为此目的制作的函数:array_intersect():
array_intersect — 计算数组的交集
$arr2 = array_intersect($arr1, $arr2);
如果要比较键,而不是像 array_intersect() 这样的值,请使用 array_intersect_key():
array_intersect_key — 使用键计算数组的交集进行比较
$arr2 = array_intersect_key($arr1, $arr2);
如果要比较key=>value
对,请使用 array_intersect_assoc():
array_intersect_assoc — 使用附加索引检查计算数组的交集
$arr2 = array_intersect_assoc($arr1, $arr2);
在array_filter回调中使用in_array:
$arr2 = array_filter($arr2, function($e) use ($arr1) {
return in_array($e, $arr1);
});
请注意,这将考虑元素的值,而不是键。 array_filter不会给你任何可以使用的键,所以如果这是你需要的,一个常规的foreach循环可能更适合。
要获取$arr2
中存在的元素也存在于$arr1
中(即删除$arr1
中不存在的$arr2
元素),您可以基于键进行相交,如下所示:
array_intersect_key($arr2, $arr1); // [a] => 10, [b] => 20
更新
从 PHP 7 开始,可以将mode
传递给 array_filter()
以指示在提供的回调函数中应传递什么值:
array_filter($arr2, function($key) use ($arr1) {
return isset($arr1[$key]);
}, ARRAY_FILTER_USE_KEY);
从 PHP 7.4 开始,您还可以使用箭头函数删除use ()
语法:
array_filter($arr2, fn($key) => isset($arr1[$key]), ARRAY_FILTER_USE_KEY);