通过键数组获取关联数组元素

时间:2012-03-17 21:36:03

标签: php arrays

$array1 = ['key1'=>'val1', 'key2'=>'val2', 'key3'=>'val3']
$array2 = ['key1','key3']

我想从array1中获取array2中包含键的所有元素。 所以结果应该是:

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

我尝试了array_intersect_key($ array1,$ array2),但这不起作用。获得上述结果的最快方法是什么?

编辑:忘记提到array2可能是一个关联数组或单维。

3 个答案:

答案 0 :(得分:6)

在使用array_intersect_key()之前,需要将key1和key2设为第二个数组中的键:使用array_flip()来执行此操作

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

修改

$ array2是否关联并不重要:

$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)

答案 1 :(得分: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;
}

有点丑陋,我认为这是提问者想要的?可能是一种更好的方式。

答案 2 :(得分:0)

不是纯粹的优雅单行,但它会起作用:

$result = array();

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

作为对编辑的回应,只需使用values($array2)