根据键数组获取数组的子集

时间:2010-08-11 03:06:50

标签: php arrays higher-order-functions

我编写了这个函数来获取数组的子集。 php是否具有内置功能。我在文档中找不到一个。如果我重新发明轮子,似乎就像浪费一样。

function array_subset($array, $keys) {
    $result = array();
    foreach($keys as $key){
        $result[$key] = $array[$key];
    }
    return $result;
}

3 个答案:

答案 0 :(得分:11)

我也一直想要这个。就像PHP版本的Underscore的pick

这是丑陋和反直觉的,但我有时会这样做(我认为这可能是prodigitalson所得到的):

$a = ['foo'=>'bar', 'zam'=>'baz', 'zoo'=>'doo'];

// Extract foo and zoo but not zam
print_r(array_intersect_key($a, array_flip(['foo', 'zoo'])));
/*
Array
(
    [foo] => bar
    [zoo] => doo
)
*/

array_intersect_key返回第一个参数的所有元素,其第二个参数中存在键(以及所有后续参数,如果有的话)。但是,由于它将密钥与密钥进行比较,为方便起见,我使用array_flip。我也可以使用['foo' => null, 'zoo' => null],但这更加丑陋。

答案 1 :(得分:10)

array_diff_keyarray_intersect_key可能就是您想要的。

答案 2 :(得分:0)

  

已解决

我认为在PHP中没有直接函数可以从array1获取一个子集,而另一个array2的值是我们获取的键名列表。

赞:array_only($array1, 'field1','field2');

但是这种方式可以实现相同。

<?php

$associative_array = ['firstname' => 'John', 'lastname' => 'Smith', 'DOB' => '2000-10-10', 'country' => 'Ireland' ];

$subset = array_intersect_key( $associative_array, array_flip( [ 'lastname', 'country' ] ) );

print_r( $subset );

// Outputs...
// Array ( [lastname] => Smith [country] => Ireland );