12

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

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

3 回答 3

15

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

这很丑陋且违反直觉,但我有时会这样做(我认为这可能是 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],但这更丑陋。

于 2016-10-26T19:23:56.580 回答
11

array_diff_key并且array_intersect_key可能是您想要的。

于 2010-08-11T03:10:56.537 回答
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 );
于 2019-05-22T05:49:40.730 回答