2012-03-17 117 views
1
$array1 = ['key1'=>'val1', 'key2'=>'val2', 'key3'=>'val3'] 
$array2 = ['key1','key3'] 

我想從array1中獲取array2中所有鍵的所有元素。 所以結果應該是:通過鍵數組獲得關聯數組元素

$result = ['key1'=>'val1', 'key3'=>'val3'] 

我試圖array_intersect_key($數組1,$數組2),但不起作用。什麼是獲得上述結果的最快方法?

編輯:忘了提及array2可能是一個關聯數組或單個維度。

回答

6

你需要讓KEY1和KEY2第二陣列中的按鍵纔可以使用array_intersect_key():使用array_flip()

$result = array_intersect_key($array1,array_flip($array2)); 

編輯

這不要緊,如果$數組2是聯想還是不是:

$array1 = array('key1'=>'val1', 'key2'=>'val2', 'key3'=>'val3'); 
$array2 = array('first'=>'key1','second'=>'key3'); 

$filteredData = array_intersect_key($array1,array_flip($array2)); 
var_dump($filteredData); 

仍然給

array 
    'key1' => string 'val1' (length=4) 
    'key3' => string 'val3' (length=4) 
+0

請參閱編輯,當array2是關聯數組時它不起作用。 – firebird 2012-03-17 21:47:42

+0

顯示你的$ array2實際是什麼:array_flip()不應該在乎它是否用在關聯數組上。 – 2012-03-17 21:52:42

0

不是一個純粹的優雅的一行,但它會工作:

$result = array(); 

foreach($array2 as $key) { 
    $result[$key] = $array1[$key]; 
} 

在回答編輯,只需使用values($array2)

1
function my_intersect($a1, $a2){ 
    $func = function(&$v, $k) { 
     $v = (is_string($k)) ? $k : $v; 
    }; 
    array_walk($a2, $func); 
    $a2 = array_fill_keys(array_values($a2),1); 
    $ret = array(); 
    if ($a1){ 
     foreach($a1 as $k => $v){ 
      if (array_key_exists($k, $a2)){ 
       $ret[$k] = $v; 
      } 
     } 
    } 
    return $ret; 
} 

有點醜,我認爲這是提問者想要什麼?可能更好的方法。