PHP数组相交(有点)

时间:2012-01-04 14:36:09

标签: php arrays

给出两个数组:

$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列表,但似乎无法找到我正在寻找的内容。我知道如果需要的话我自己该怎么做,但我认为这可能是一个普遍存在的问题,可能有一个内置函数来做它并且不想重新发明轮子。

3 个答案:

答案 0 :(得分: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 :(得分: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)
}

答案 2 :(得分:0)

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

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

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