web-dev-qa-db-ja.com

指定されたキーを除くすべての配列要素を返します

単純なものです。連想配列から、指定されたキーに一致しないすべての値を返すクリーンで雄弁な方法があるのか​​と思っていましたか?

$array = array('alpha' => 'Apple', 'beta' => 'banana', 'gamma' => 'guava');

$alphaAndGamma = arrayExclude($array, array('alpha'));
$onlyBeta      = arrayExclude($array, array('alpha', 'gamma'));

function arrayExclude($array, Array $excludeKeys){
    foreach($array as $key => $value){
        if(!in_array($key, $excludeKeys)){
            $return[$key] = $value;
        }
    }
    return $return;
}

これは私が(将来的に)使用しているものですが、よりクリーンな実装はありますか?おそらくマニュアルで見逃したものですか?

20
Dan Lugg

あなたはただ unset 値:

$alphaAndGamma = $array;
unset($alphaAndGamma['alpha']);

編集:わかりやすくしました。別の変数に割り当てることで配列をコピーできます。

または関数内:

function arrayExclude($array, Array $excludeKeys){
    foreach($excludeKeys as $key){
        unset($array[$key]);
    }
    return $array;
}
25
Felix Kling

この質問は古すぎますが、この質問にはいくつかの回答がありますが、私は誰かに役立つかもしれない解決策を投稿しています。

以下を使用して除外するように定義した特定のキーを除いて、提供された入力からすべての配列要素を取得できます。

$result = array_diff_key($input, array_flip(["SomeKey1", "SomeKey2", "SomeKey3"]));

これにより、キー$inputSomeKey1SomeKey2を持つSomeKey3配列から要素が除外され、その他すべての要素が$result変数に返されます。

19
Dev

array_diff_key()を使用:

$array = array('alpha' => 'Apple', 'beta' => 'banana', 'gamma' => 'guava');

$alphaAndGamma = array_diff_key($array, array('alpha'=>0));
$onlyBeta      = array_diff_key($array, array('alpha'=>0, 'gamma'=>0));

編集:=> 0sを追加しました。

11
linepogl
$alphaAndGamma = $array;
unset($alphaAndGamma['alpha']);

$onlyBeta = $array;
unset($onlyBeta['alpha'], $onlyBeta['gamma']);
2
steveo225

In_arrayを使用するときの速度について、いくつかの議論がありました。このコメントを含めて私が読んだもの 1 から、issetの使用はin_arrayよりも高速です。

その場合、コードは次のようになります。

function arrayExclude($array, array $excludeKeys){

    $return = [];

    foreach($array as $key => $value){
        if(!isset($excludeKeys[$key])){
            $return[$key] = $value;
        }
    }
    return $return;
}

これはわずかに高速で、大きなデータセットを処理する必要がある場合に役立ちます。

1
dmcnelis

これを使用すると、キーで配列項目を簡単に削除できます。

unset($array['key']); 

[〜#〜] demo [〜#〜]http://codepad.org/EA9vTwzR

0
Dutchie432