-1

私は2つの配列を持っています。1 つはデータを含み、もう 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()て目的の出力を実現できます:

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 に答える