PhP:合并具有匹配键的数组并删除/删除额外的不匹配值

时间:2013-03-09 03:06:27

标签: php arrays merge key key-value

我想基于它们的键合并这两个数组,并且只保留键匹配。合并后的数组应保留键,值应来自第二个数组。

数组#1:我访问过的国家

Array
(
    [AL] => 113
    [AZ] => 83
    [CA] => 50
    [CO] => 1
...

数组#2:所有州

Array
(
    [AL] => ALABAMA
    [AK] => ALASKA
    [AZ] => ARIZONA
    [AR] => ARKANSAS
    [CA] => CALIFORNIA
    [CO] => COLORADO
    [CT] => CONNECTICUT
...

所以,如果我去过某个州,我想从数组2中获取该状态的名称。并从数组#2中删除任何不匹配的节点。

期望的结果

Array
(
    [AL] => ALABAMA
    [AZ] => ARIZONA
    [CA] => CALIFORNIA
    [CO] => COLORADO
...

我在PHP手册和StackOverflow上做了大量研究,但找不到具体的答案。我认为它可能在于比我现在能够更复杂的用户定义函数。

array_merge()几乎可以做我想要的,但是它会将我没有访问过的状态添加到数组的末尾

array_intersect_key()也接近了。它只保留匹配的键,但随后它会删除值。

1 个答案:

答案 0 :(得分:5)

在我写一个更好的解决方案时享受这个效率低下的例子。 http://codepad.org/hIjPEM81

效率低下的解决方案1:

<?php
$allstates=array("MO"=>"Missouri", "TX"=>"Texas");
$statesIveBeenTo = array("MO"=>1);
foreach($allstates as $k=>$v){
  if(!array_key_exists($k,$statesIveBeenTo)){
    unset($allstates[$k]);
  }
}

var_dump($allstates);

<强>输出:

array(1) {
  ["MO"]=>
  string(8) "Missouri"
}

解决方案2:

$test = array_intersect_key($allstates, $statesIveBeenTo);
var_dump($test);

与上面相同的输出。