2012-07-25 30 views
16

我有了國家的數組:數組相交在數組中的鍵?

array(
'AF'=>'AFGHANISTAN', 
'AL'=>'ALBANIA', 
'DZ'=>'ALGERIA', 
'AS'=>'AMERICAN SAMOA', 
); 

和我有了一些鍵在它

array('AL', 'DZ'); 

我要打電話,將採取兩個數組作爲參數的函數另一個數組並返回

array(
'AL'=>'ALBANIA', 
'DZ'=>'ALGERIA', 
); 

我知道PHP內置函數比較鍵或值,但似乎這些功能都指望你哈有兩個1D陣列或兩個2D陣列。

我可以遍歷array_keys()的第一陣列和做每個鍵in_array()檢查,但似乎真的inefficent ...

回答

39
$selection = array('AL', 'DZ'); 
$filtered = array_intersect_key($countries, array_flip($selection)); 
var_dump($filtered); 
+0

我不得不看兩次,但這是一個非常好的簡短解決方案。 +1 – 2012-07-25 07:35:03

+0

@deceze - 好的解決方案 - 是否有一種有效的方法來計算新數組中的所有值是否匹配(例如,在這裏檢查:$ selection = array('AL','AF','DZ',' AS'); – JM4 2013-07-16 16:48:30

+2

@ JM4是的,做一個'diff'而不是'intersect'。 – deceze 2013-07-16 16:56:33

-2

如果我理解正確的話你有國家的數組,需要國家的陣列和你想要與所需的國家創建數組。如果是這樣,那麼你可以試試這個:

$countries = array ("AF"=>"AFGJANISTAN", "AL"=>"ALBANIA", "LV"=>"LATVIA", "USA"=>"UNITED STATES OF AMERICA"); 
$needed = array ("AF", "AL"); 

$result = array(); 
foreach ($needed as $row) { 
    if (in_array($row, $contries)) { 
     $result[] = $countries[$row]; 
    } 
} 
var_dump($result); 
+0

這是不正確的答案。 請閱讀http://php.net/manual/en/function.in-array.php – 2014-08-06 03:54:35

4

簡單地遍歷SECOND數組,並從第一個數組中取值。虎鉗似乎並不需要低效。

所以:

$Arr1 = array(
'AF'=>'AFGHANISTAN', 
'AL'=>'ALBANIA', 
'DZ'=>'ALGERIA', 
'AS'=>'AMERICAN SAMOA', 
); 

$Arr2 = array('AL', 'DZ'); 

$result = array(); 
foreach ($Arr2 as $cc){ 
    if (isset($Arr1[$cc])){ 
    $result[$cc] = $Arr1[$cc]; 
    } 
} 
print_r($result); 

我不認爲這是低效的。

編輯添加:如果您100%確定$ Arr2只包含可以在$ Arr1中找到的代碼,那麼您當然可以跳過isset()測試。

+2

+1的in_array函數以提高效率,但我更喜歡我的交集方法,因爲它更加簡潔並且可能足夠高效。 .. :) – deceze 2012-07-25 07:20:39

+0

@deceze:我個人需要更多的時間來理解你的方法。雖然它更短(代碼行),但我必須三思而後行。例如,它如何處理缺失條目。經過兩次思考,我發現它處理它們就好了。 ;-)尼斯解決方案! – 2012-07-25 07:34:27

-1

我認爲這會有所幫助。這是一個函數key_values_intersect,它可以像你期望的那樣工作:)

$longcodes = array(
    'AF' => 'AFGHANISTAN', 
    'AL' => 'ALBANIA', 
    'DZ' => 'ALGERIA', 
    'AS' => 'AMERICAN SAMOA', 
); 

$code = array('AL', 'DZ'); 

function key_values_intersect($haystack, $needle) 
{ 
    $tmp=array(); 
    foreach ($needle AS $key) { 
     $tmp[$key] = $haystack[$key]; 
    } 
    return $tmp; 
} 


print_r(key_values_intersect($longcodes,$code));