1. ホーム
  2. php

[解決済み] 許容されるキーの配列を使って、そのキーで配列をフィルタリングする

2022-03-24 14:40:02

質問

のコールバック関数は array_filter() は配列の値のみを渡し、キーは渡しません。

持っていれば

$my_array = array("foo" => 1, "hello" => "world");

$allowed = array("foo", "bar");

のキーをすべて削除するには、どのような方法がありますか? $my_array にないものは $allowed の配列は?

希望する出力

$my_array = array("foo" => 1);

解決方法は?

PHP 5.6では、3番目のパラメータとして array_filter() , flag に設定できること。 ARRAY_FILTER_USE_KEY を使用すると、値ではなくキーでフィルタリングすることができます。

$my_array = ['foo' => 1, 'hello' => 'world'];
$allowed  = ['foo', 'bar'];
$filtered = array_filter(
    $my_array,
    function ($key) use ($allowed) {
        return in_array($key, $allowed);
    },
    ARRAY_FILTER_USE_KEY
);

PHP 7.4 で矢印関数が導入されたので、これをもっと簡潔なものにすることができます。

$my_array = ['foo' => 1, 'hello' => 'world'];
$allowed  = ['foo', 'bar'];
$filtered = array_filter(
    $my_array,
    fn ($key) => in_array($key, $allowed),
    ARRAY_FILTER_USE_KEY
);

のようなエレガントなものではないことは明らかです。 array_intersect_key($my_array, array_flip($allowed)) しかし、これにはキーに対して任意のテストを行うという柔軟性があります。 $allowed は、プレーンな文字列ではなく、正規表現パターンを含むことができます。

を使用することもできます。 ARRAY_FILTER_USE_BOTH を使用すると、値とキーの両方がフィルタ関数に渡されます。最初の例をもとにした例を示しますが、フィルタリングルールのエンコードには $allowed このように

$my_array = ['foo' => 1, 'bar' => 'baz', 'hello' => 'wld'];
$allowed  = ['foo' => true, 'bar' => true, 'hello' => 'world'];
$filtered = array_filter(
    $my_array,
    // N.b. it's ($val, $key) not ($key, $val):
    fn ($val, $key) => isset($allowed[$key]) && (
        $allowed[$key] === true || $allowed[$key] === $val
    ),
    ARRAY_FILTER_USE_BOTH
); // ['foo' => 1, 'bar' => 'baz']