过滤关联数组以保留在另一个平面数组中作为值找到的键的元素[重复]

问题描述 投票:0回答:3

给定两个数组:

$foo = array('a', 'b', 'c');
$bar = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

是否有内置的 PHP 函数来生成以下结果数组?

$result = array('a' => 1, 'b' => 2, 'c' => 3);

我已经浏览了 php.net 上的 Array Functions 列表,但似乎找不到我要找的东西。 如果需要的话,我知道如何自己做这件事,但我认为这可能是一个很常见的问题,可能有一个内置函数可以做到这一点,并且不想重新发明轮子。

php arrays filtering associative-array intersection
3个回答
6
投票

另一种使用 array_fliparray_intersect_keys 的方法:

$foo = array('a', 'b', 'c'); 
$bar = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

$common = array_intersect_key($bar, array_flip($foo));

输出

array(3) {
  ["a"]=>
  int(0)
  ["b"]=>
  int(1)
  ["c"]=>
  int(2)
}

1
投票

这是一个有点肮脏的黑客,但它有效:

function extractKeys($keys, $data) {
    extract($data);

    return call_user_func_array('compact', $keys);
}

$foo = array('a', 'b', 'c');
$bar = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

var_dump(extractKeys($foo, $bar));

输出:

array(3) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
  ["c"]=>
  int(3)
}

0
投票

发帖后,我想到了一种方法:

array_intersect_key($bar, array_fill_keys($foo, NULL))

虽然,这并不是我所希望的简洁的内置函数,但它绝对比手动构造结果数组要好。

© www.soinside.com 2019 - 2024. All rights reserved.