2013-03-09 51 views
1

我想合并这两个数组的基础上,他们的关键,只保留关键匹配。合并的数组应该保留该键,并且该值应该来自第二个数组。PhP:合并具有匹配键的数组,并删除/删除额外的不匹配的值

阵列#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 
... 

所以,如果我去过的状态,我d喜欢从数组2中获取该状态的名称。并抛出数组#2中的任何不匹配的节点。

所需的结果

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

我已经做了广泛的研究,在PHP手册和StackOverflow上,并不能找到一个特定的答案。我认为它可能存在于一个更复杂的用户定义函数中,而不是我现在能够做到的。

array_merge()几乎我想要做什么,但随后补充说我也没去过到阵列

array_intersect_key()也得到接近结束时的状态。它只保留匹配的键,但是却没有值。

+0

['array_intersect_key()'](http://php.net/array_intersect_key)的问题可能是您的数组顺序错误。它保留了它传递的第一个数组的值,所以你希望array#2作为第一个参数,然后array#1作为第二个参数。 – Wiseguy 2013-03-09 03:18:07

回答

4

在我写出更好的解决方案的同时,享受这个温和低效的例子。 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); 

与上面相同的输出。

+0

首先,谢谢!效率低下,我需要它的一切。然而,在掌舵几小时后,我从来没有想过在array_intersect_key()中翻转数组。我正在使用array_intersect_key($ statesIveBeenTo,$ allstates);这是学习曲线的一部分。 – JoMoWeb 2013-03-09 03:25:14

+0

...并阅读手册。 (好吧,没有办法让听起来居高临下的简短评论,所以我提供这个免责声明,我不打算让它居高临下。)大家非常认真,当你有更多的时候,设计一个解决方案通常更容易具体了解某个功能的功能或工作原理。 – Wiseguy 2013-03-09 03:32:17

+0

我很欣赏你的反馈,而不是居高临下。我在解决方案之前和之后阅读[this](http://php.net/manual/en/function.array-intersect-key.php)。我想我只是被卡在了要合并到的数组1上,我没有这样想过解决方案。当我在第三小时,是我需要与人类合作的时候。 – JoMoWeb 2013-03-09 03:52:28

相关问题