14

我有以下两个数组:

$array_one = array('colorZero'=>'black', 'colorOne'=>'red', 'colorTwo'=>'green', 'colorThree'=>'blue', 'colorFour'=>'purple', 'colorFive'=>'golden');

$array_two = array('colorOne', 'colorTwo', 'colorThree');

我想要一个数组,$array_one其中仅包含其键是 $array_two 成员的键值对(通过创建一个新数组或从中删除其余元素$array_one

我怎样才能做到这一点?

我查看了array_diffand array_intersect,但它们将值与值进行比较,而不是将一个数组的值与另一个数组的键进行比较。

4

3 回答 3

27

从 PHP 5.1 开始有array_intersect_key手册)。

只需将第二个数组从key=>value翻转到value=>key witharray_flip()然后比较键。

因此,要比较 OP 的数组,可以这样做:

$result = array_intersect_key( $array_one , array_flip( $array_two ) );

根本不需要任何循环数组。

于 2015-06-15T08:57:45.310 回答
6

更新

查看 Michel 的答案:https ://stackoverflow.com/a/30841097/2879722 。这是一个更好、更容易的解决方案。


原始答案

如果我正确理解这一点:

返回一个新数组:

$array_new = [];
foreach($array_two as $key)
{
    if(array_key_exists($key, $array_one))
    {
        $array_new[$key] = $array_one[$key];
    }
}

从 $array_one 中剥离:

foreach($array_one as $key => $val)
{
    if(array_search($key, $array_two) === false)
    {
        unset($array_one[$key]);
    }
}
于 2014-08-24T14:14:25.963 回答
0

告诉我它是否有效:

for($i=0;$i<count($array_two);$i++){
  if($array_two[$i]==key($array_one)){
     $array_final[$array_two[$i]]=$array_one[$array_two[$i]];
     next($array_one);
  }
}
于 2014-08-24T13:48:17.080 回答