2011-08-18 105 views
5

我有一個關聯數組和一個鍵數組。如何使用PHP中的鍵數組篩選關聯數組?

$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen'); 
$B = array('a', 'b'); 

如何建立從$A所有元素,其中的關鍵是$B關聯數組? 對於上面的例子中,答案是

$C = array('a'=>'book', 'b'=>'pencil'); 

回答

2
$keys = array_keys($B); 
$C = array(); 
foreach ($A as $key => $value) 
{ 
    if (in_array($key, $keys)) 
    { 
    $C[$key] = $value; 
    } 
} 
+0

感謝您的回答。 – Fazri

2

下面是一個簡單的解決方案,其檢查該密鑰在$A存在其追加到$C

$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen'); 
$B = array('a', 'b'); 

$C = array(); 
foreach ($B as $bval) { 
    // If the $B key exists in $A, add it to $C 
    if (isset($A[$bval])) $C[$bval] = $A[$bval]; 
} 

var_dump($C); 

// Prints: 
array(2) { 
    ["a"]=> 
    string(4) "book" 
    ["b"]=> 
    string(6) "pencil" 
} 
+0

顯然錯了:/。 OP需要用另一個過濾一個數組,你的解決方案不會。而'$ C'的結果應該是一個關聯數組,在你的解決方案中它是一個索引的數組。 –

+0

編輯使'$ C'聯想 –

+0

顯然工作然後;) –

16
$keys = array_flip($B); 
$C = array_intersect_key($A,$keys); 
1

令我極爲驚訝的是,foreach循環方法更快。

下面的快速基準測試腳本給我的結果: array_intersect_key: 0.76424908638 foreach loop: 0.6393928527832

$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen'); 
$B = array('a', 'b'); 

$start = microtime(true); 
for ($i = 0 ; $i < 1000000; $i++) { 
$c = array_intersect_key($A,array_flip($B)); 
} 

$t1 = microtime(true); 

for ($i = 0; $i < 1000000; $i++) { 
$C = array(); 
    foreach ($B as $bval) { 
      // If the $B key exists in $A, add it to $C 
      if (isset($A[$bval])) $C[$bval] = $A[$bval]; 
    } 
} 

$t2 = microtime(true); 
echo "array_intersect_key: " . ($t1 - $start), "\n"; 
echo "foreach loop: " . ($t2 - $t1), "\n"; 
+1

真棒\ o /(和更多的字符達到15)。 –