Die PHP-Funktion array_intersect_key() verstehen
Die PHP-Funktion array_intersect_key() vergleicht Arrays anhand ihrer Schlüssel und gibt nur die Einträge mit übereinstimmenden Schlüsseln zurück.
Die PHP-Funktion array_intersect_key() vergleicht zwei oder mehr Arrays anhand ihrer Schlüssel und gibt ein neues array zurück, das die Einträge aus dem ersten array enthält, deren Schlüssel in jedem anderen array vorhanden sind. Entscheidend dabei ist, dass die Werte völlig ignoriert werden — nur die Schlüssel bestimmen, was behalten wird, und die zurückgegebenen Werte stammen immer aus dem ersten array. Diese Seite erläutert, wie die Funktion funktioniert, wann man sie einsetzen sollte und welche Fallstricke es gibt.
Zweck
array_intersect_key() beantwortet die Frage: „Welche Einträge dieses Arrays erscheinen — nach Schlüssel — auch in allen anderen Arrays?" Ein häufiger Anwendungsfall in der Praxis ist das Whitelisting von Formulareingaben oder Konfigurationen: Man behält nur die explizit erlaubten Schlüssel und verwirft alles andere in einem einzigen Aufruf.
Sie gehört zur gleichen Familie wie array_intersect(), die nach Wert vergleicht, und array_diff_key(), die die Schlüssel zurückgibt, die in den anderen Arrays fehlen.
Syntax
array_intersect_key(array $array, array ...$arrays): array| Parameter | Beschreibung |
|---|---|
$array | Das array, aus dem Einträge behalten werden. Seine Schlüssel werden mit jedem anderen array abgeglichen, und seine Werte werden zurückgegeben. |
$arrays | Ein oder mehrere Arrays, deren Schlüssel mit $array verglichen werden. Ihre Werte werden nie verwendet. |
Ein Eintrag bleibt nur erhalten, wenn sein Schlüssel in allen angegebenen Arrays vorhanden ist. Die ursprünglichen Schlüssel/Wert-Paare aus dem ersten array werden im Ergebnis beibehalten.
Beispiele
Zwei Arrays vergleichen
Die in beiden Arrays gemeinsamen Schlüssel sind a und b, also werden diese Einträge behalten. Beachte, dass die Werte für Schlüssel b unterschiedlich sind (brown vs. yellow) — das spielt keine Rolle, nur der Schlüssel muss übereinstimmen, und der Wert kommt aus $array1. Das einfache Element "red" in $array1 erhält den impliziten numerischen Schlüssel 0, der in $array2 nicht vorhanden ist und daher wegfällt:
Array
(
[a] => green
[b] => brown
)Drei Arrays vergleichen
Wenn mehr als zwei Arrays übergeben werden, muss ein Schlüssel in jedem array vorhanden sein, um erhalten zu bleiben.
Nur Schlüssel a ist in allen drei Arrays vorhanden. Schlüssel b fehlt in $array3 und Schlüssel c fehlt in $array2, sodass beide wegfallen:
Array
(
[a] => green
)Ein array anhand seiner Schlüssel auf eine Whitelist beschränken
Die praktischste Verwendung von array_intersect_key() ist das Filtern eines assoziativen Arrays auf eine zugelassene Menge von Schlüsseln — zum Beispiel das Akzeptieren nur bekannter Felder aus Benutzereingaben:
<?php
$input = array(
"name" => "Ann",
"email" => "[email protected]",
"is_admin" => true, // attacker-supplied field we must ignore
);
$allowed = array("name" => "", "email" => "");
$safe = array_intersect_key($input, $allowed);
print_r($safe);
?>Die Werte von $allowed sind irrelevant — es dient rein als Liste der erlaubten Schlüssel. Das gefährliche Feld is_admin wird herausgefiltert:
Array
(
[name] => Ann
[email] => [email protected]
)Wichtige Hinweise
- Es werden nur Schlüssel verglichen, niemals Werte. Zwei Einträge mit demselben Schlüssel aber unterschiedlichen Werten stimmen trotzdem überein. Die zurückgegebenen Werte stammen immer aus dem ersten array.
- Die Reihenfolge der Arrays beeinflusst nicht, welche Schlüssel erhalten bleiben, aber die Reihenfolge der Einträge im Ergebnis folgt dem ersten array.
- Der Schlüsselvergleich ist bei string-Schlüsseln Groß-/Kleinschreibungssensitiv:
"A"und"a"sind unterschiedliche Schlüssel. - Numerische Schlüssel werden als Integer verglichen. Der string-Schlüssel
"1"und der Integer-Schlüssel1werden als identisch behandelt, da PHP numerische string-Array-Schlüssel zu Integern normalisiert. - Die Übergabe eines einzelnen Arrays gibt dieses array unverändert zurück; die Übergabe eines Nicht-array-Arguments löst einen
TypeErroraus.
Verwandte Funktionen
array_intersect()— Schnittmenge nach Wert statt nach Schlüssel.array_intersect_assoc()— Abgleich von Schlüssel und Wert.array_diff_key()— das Gegenteil: Einträge behalten, deren Schlüssel in den anderen Arrays nicht vorhanden sind.array_key_exists()— Prüfung auf einen einzelnen Schlüssel.- Mit PHP-Arrays arbeiten — die umfassende Array-Referenz.