2012-01-04 64 views
2

給定兩個數組:PHP陣列相交(在某種程度上)

$foo = array('a', 'b', 'c'); 
$bar = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5); 

是否有一個內置的PHP函數來產生如下結果陣列?

$result = array('a' => 1, 'b' => 2, 'c' => 3); 

我經歷過的Array Functions名單上php.net,但似乎無法找到我要找的。如果需要,我知道如何自己做,但我認爲這可能是一個常見的問題,可能有一個內置函數可以實現,並且不想重新發明。

+0

基本上從$ bar中取出鍵/ val對,其中bar的鍵在$ foo中具有匹配值? – 2012-01-04 14:37:34

+0

澄清:所以你想從第二個數組中提取與第一個數組匹配的鍵的值? – ManseUK 2012-01-04 14:37:57

+0

是的,我想要一個結果數組,其中包含第二個數組($ bar)中的元素,但只有第一個數組中的鍵('$ foo')。 – FtDRbwLXw6 2012-01-04 14:40:22

回答

6

使用array_fliparray_intersect_keys另一種方式:

$foo = array('a', 'b', 'c'); 
$bar = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5); 

$common = array_intersect_key($bar, array_flip($foo)); 

輸出

array(3) { 
    ["a"]=> 
    int(0) 
    ["b"]=> 
    int(1) 
    ["c"]=> 
    int(2) 
} 
+0

顛倒array_intersect_key()的參數順序以維護原始$ bar陣列的值 – 2012-01-04 14:51:52

+0

@Mark Ba​​ker。好決定!謝謝。 – Josh 2012-01-04 14:54:36

+0

這與我發佈的解決方案非常相似,但是我選擇它是因爲在使用'array_fill_keys($ foo,NULL)'時使用'array_flip($ foo)'。 – FtDRbwLXw6 2012-01-04 15:34:57

0

張貼後,我想到了這樣的一種方法:

array_intersect_key($bar, array_fill_keys($foo, NULL)) 

雖然,這是不是真的,我希望爲的簡潔,內置的功能,它絕對不是構造所產生的更好數組手動。

+2

array_fill_keys($ foo,NULL)可以替換爲array_flip($ foo) – 2012-01-04 14:47:42

+0

@MarkBaker:我從來沒有想過在非關聯數組上使用'array_flip()'。這是一個巧妙的伎倆,謝謝。 – FtDRbwLXw6 2012-01-04 14:50:20

+0

陣列的最佳類型使用它....沒有重複值導致在翻轉時覆蓋鍵的風險 – 2012-01-04 14:53:52

1

這是一個有點髒的黑客攻擊,但它的工作原理:

function extractKeys($keys, $data) { 
    extract($data); 

    return call_user_func_array('compact', $keys); 
} 

$foo = array('a', 'b', 'c'); 
$bar = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5); 

var_dump(extractKeys($foo, $bar)); 

輸出:

array(3) { 
    ["a"]=> 
    int(1) 
    ["b"]=> 
    int(2) 
    ["c"]=> 
    int(3) 
}