按另一个平面关联数组中的键筛选平面关联数组


Filter a flat, associative array by the keys in another flat, associative array

我有两个数组:

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