2013-03-09 129 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