Mit PHP 5.6 wurde ein dritter Parameter für array_filter()
, flag
, die Sie auf ARRAY_FILTER_USE_KEY
um nach dem Schlüssel statt nach dem Wert zu filtern:
$my_array = ['foo' => 1, 'hello' => 'world'];
$allowed = ['foo', 'bar'];
$filtered = array_filter(
$my_array,
function ($key) use ($allowed) {
// N.b. in_array() is notorious for being slow
return in_array($key, $allowed);
},
ARRAY_FILTER_USE_KEY
);
Seit PHP 7.4 die Pfeilfunktionen eingeführt hat, können wir dies knapper fassen:
$my_array = ['foo' => 1, 'hello' => 'world'];
$allowed = ['foo', 'bar'];
$filtered = array_filter(
$my_array,
fn ($key) => in_array($key, $allowed),
ARRAY_FILTER_USE_KEY
);
Natürlich ist das nicht so elegant wie array_intersect_key($my_array, array_flip($allowed))
Es bietet jedoch die zusätzliche Flexibilität, einen beliebigen Test gegen den Schlüssel durchzuführen, z. B. $allowed
könnte Regex-Muster anstelle von einfachen Zeichenketten enthalten.
Sie können auch Folgendes verwenden ARRAY_FILTER_USE_BOTH
um sowohl den Wert als auch den Schlüssel an Ihre Filterfunktion zu übergeben. Hier ist ein erfundenes Beispiel, das auf dem ersten basiert, aber beachten Sie, dass ich nicht empfehlen würde, Filterregeln zu kodieren, die $allowed
auf diese Weise:
$my_array = ['foo' => 1, 'bar' => 'baz', 'hello' => 'wld'];
$allowed = ['foo' => true, 'bar' => true, 'hello' => 'world'];
$filtered = array_filter(
$my_array,
fn ($val, $key) => isset($allowed[$key]) && (
$allowed[$key] === true || $allowed[$key] === $val
),
ARRAY_FILTER_USE_BOTH
); // ['foo' => 1, 'bar' => 'baz']