PHP:如何比较一个数组中的键和另一个数组中的值,并返回匹配项?

15

我有以下两个数组:

$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_diffarray_intersect,但它们比较的是值和值,而不是一个数组的值与另一个数组的键。


3
array_diff()或array_intersect()结合array_keys()使用。 - Mark Baker
3个回答

31

自 PHP 5.1 版本开始有 array_intersect_key 函数(手册)。

只需使用 array_flip() 将第二个数组中的键值对翻转(从 key=>valuevalue=>key),然后比较键。

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

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

完全不需要循环数组。


好的一行解决方案,但我认为这个函数循环相同。 - sigmaxf

6

更新

请查看Michel的回答:https://dev59.com/L18e5IYBdhLWcg3wssEV#30841097。这是更好、更简单的解决方案。


原始回答

如果我理解正确:

返回一个新的数组:

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

在内存方面,哪个更快且成本更低?我认为是第二个? - Solace
1
是的,我会选择第二个。在其中,较小的数组用于比较,并且您正在剥离已经设置的变量,而不是创建新变量。 - Skarpi Steinthorsson
第二种方法是快速进行“AND”比较的一个非常好的建议! - Thanasis

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

$array_final 是一个新的数组,对吗?但是当我在循环后尝试执行 print_r($array_final); 时,我收到了 Notice: Undefined variable: array_final in C:\xampp\htdocs\testsNine.php on line 14 的提示。 :s - Solace
抱歉,我忘记声明它了: $array_final = array(); - garry towel
我确实尝试过声明它。但是它打印了一个空数组。你还将count($array_two)和JS中的$array_two.length混淆了,这也导致了错误。但是我理解了这个概念。所以谢谢你。 - Solace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接