-1

我有两个数组。一个包含数据,另一个包含键。所以我有

$data = array(
    'name' => array('label' => 'Name:', 'value' => 'Genghis'),
    'age' => array('label' => 'Age:', 'value' => '67'),
    'weigh' => array('label' => 'Weigh in Kgs:', 'value' => '78')
);

$keys = array('name', 'age');

现在我只想提取name和的age元素$data。像这样的东西。

$extracted = somemethod($data, $keys);
var_export($extracted);

输出应该是这样的。

array(
    'name' => array(
        'label' => 'Name:', 
        'value' => 'Genghis',
    ),
    'age' => array(
        'label' => 'Age:',
        'value' => '67',
    ),
)

我怎样才能做到这一点?

4

3 回答 3

3

我会使用这样的array_intersect_key()函数:

$data = array(...); // initial array as described
$retained_keys = array('name' => 'value not used', 'age' => 'value not used');

$filtered_array = array_intersect_key($data, $retained_keys);
于 2013-04-25T17:11:03.890 回答
2

遍历键,获取数组值,然后返回它们:

function somemethod($data, $keys) {
    $return = array();
    foreach( $keys as $k) {
        $return[$k] = isset( $data[$k]) ? $data[$k] : null;
    }
    return $return;
}

当找不到字段时,上面添加了“null”。您可以修改循环以在数组中foreach找不到键时跳过键,如下所示:$data

function somemethod($data, $keys) {
    $return = array();
    foreach( $keys as $k) {
        if( isset( $data[$k])) {
            $return[$k] = $data[$k];
        }
    }
    return $return;
}

编辑:为了扩展 Mike Brant 的答案,array_intersect_key()可以array_flip()在函数中使用 with 来实现所需的输出:

function somemethod($data, $keys) {
    $keys = array_flip( $keys);
    return array_intersect_key($data, $keys);
}

是的,它使用array_flip(),但原始$keys数组未修改,因为该数组的副本会被翻转。因此,您仍然可以使用以下命令调用此函数:

$extracted = somemethod( $data, array('name', 'age'));
于 2013-04-25T17:01:14.597 回答
1

写起来并不繁琐

$extracted = array();
foreach($keys as $key) {
    if (isset($data[$key])) 
        $extracted[$key] = $data[$key];
}
于 2013-04-25T17:01:25.550 回答