2012-03-17 76 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; 
} 

有点丑,我认为这是提问者想要什么?可能更好的方法。