Die PHP-Funktion array_diff_key verstehen
Die PHP-Funktion array_diff_key vergleicht arrays anhand ihrer Schlüssel und gibt Einträge zurück, die nur im ersten array vorhanden sind.
array_diff_key() vergleicht zwei oder mehr arrays anhand ihrer Schlüssel und gibt die Einträge des ersten arrays zurück, deren Schlüssel in keinem der anderen arrays vorhanden sind. Das entscheidende Wort ist Schlüssel: Die Funktion betrachtet die Werte niemals. Damit ist sie das richtige Werkzeug, wenn Elemente eines arrays basierend auf einer Menge von Schlüsseln entfernt oder beibehalten werden sollen – etwa um unerwünschte Felder aus Formulareingaben zu entfernen oder um herauszufinden, welche Konfigurationsoptionen in einem Override fehlen.
Diese Seite behandelt die Funktionssignatur, ein ausführbares Beispiel, den Umgang der Funktion mit Werten und numerischen Schlüsseln, die häufigsten praxisnahen Anwendungsfälle und den Unterschied zu verwandten array-Vergleichsfunktionen.
Syntax
array_diff_key(array $array, array ...$arrays): array$array— das array, das als Referenz dient (das Ergebnis enthält ausschließlich dessen Einträge)....$arrays— ein oder mehrere arrays, deren Schlüssel dazu verwendet werden, Einträge aus$arrayauszuschließen.- Gibt ein neues array zurück. Jeder Eintrag von
$arraywird nur dann beibehalten, wenn sein Schlüssel in keinem der anderen arrays vorkommt. Schlüssel und Werte bleiben genau so erhalten, wie sie in$arraystanden.
Wie array_diff_key funktioniert
Die Funktion durchläuft die Schlüssel des ersten arrays. Für jeden Schlüssel prüft sie alle anderen arrays; wird der Schlüssel irgendwo gefunden, wird der Eintrag verworfen. Nur Einträge, deren Schlüssel ausschließlich im ersten array vorkommen, bleiben erhalten.
Hier ist ein praxisnahes Beispiel – ein vollständiges Preisverzeichnis wird mit den Artikeln verglichen, die bereits einen Rabatt erhalten haben, um die Artikel zu finden, die noch keinen haben:
PHP-Beispiel zur Verwendung von array_diff_key
<?php
$prices = [
"apple" => 1.20,
"banana" => 0.50,
"cherry" => 3.00,
"date" => 2.10,
];
// Items that already have a discounted price.
$discounted = ["banana" => 0.40, "date" => 1.90];
// Keep only the items NOT present in $discounted (compared by key).
$result = array_diff_key($prices, $discounted);
print_r($result);
?>Die Ausgabe behält apple und cherry, weil ihre Schlüssel in $discounted nicht vorhanden sind. Beachten Sie, dass banana und date entfernt werden, obwohl sich ihre Werte zwischen den beiden arrays unterscheiden – array_diff_key() ignoriert Werte vollständig:
Array
(
[apple] => 1.2
[cherry] => 3
)Mehr als zwei arrays vergleichen
Es können beliebig viele arrays übergeben werden. Ein Eintrag wird entfernt, wenn sein Schlüssel in einem davon vorkommt:
<?php
$a = ["color" => "red", "size" => "M", "qty" => 5];
$b = ["color" => "blue"];
$c = ["qty" => 99];
print_r(array_diff_key($a, $b, $c));
?>Nur size bleibt übrig, weil color von $b und qty von $c gefunden wird:
Array
(
[size] => M
)Schlüssel werden als string verglichen
PHP wandelt alle Schlüssel vor dem Vergleich in string um, sodass der ganzzahlige Schlüssel 0 und der string-Schlüssel "0" als derselbe Schlüssel behandelt werden. Dies ist relevant, wenn numerische und string-Schlüssel gemischt werden:
<?php
$nums = [0 => "a", 1 => "b", 2 => "c"];
$remove = ["0" => "x", "2" => "y"];
print_r(array_diff_key($nums, $remove));
?>Array
(
[1] => b
)Anwendungsfälle für array_diff_key
- Felder auf Whitelist/Blacklist setzen. Unerwünschte Schlüssel aus Benutzereingaben entfernen:
array_diff_key($input, array_flip(['password', 'token']))entfernt diese beiden Schlüssel unabhängig von ihren Werten. - Fehlende Konfiguration finden. Eine Menge von Standardwerten mit einer benutzerseitig angegebenen Konfiguration vergleichen, um zu sehen, welche Schlüssel fehlen.
- Datensätze abgleichen. Datensätze (nach ID als Schlüssel) identifizieren, die in einem array, aber nicht in einem anderen vorhanden sind.
- Request-Daten bereinigen, bevor sie an eine Funktion übergeben werden, die unerwartete Schlüssel ablehnt.
Tipp: Wenn stattdessen nur die Einträge beibehalten werden sollen, deren Schlüssel in einem anderen array vorkommen, verwenden Sie
array_intersect_key()– es ist das Gegenstück zuarray_diff_key().
array_diff_key im Vergleich zu verwandten Funktionen
| Funktion | Vergleicht nach | Werte berücksichtigt? |
|---|---|---|
array_diff_key() | Schlüssel only | nein |
array_diff() | Werte only | ja |
array_diff_assoc() | Schlüssel und Werte | ja |
array_diff_ukey() | Schlüssel via Callback | nein |
Wenn zusätzlich zur Schlüsselprüfung auch die Werte geprüft werden sollen, verwenden Sie array_diff_assoc(). Um den Schlüsselvergleich anzupassen (z. B. für Groß-/Kleinschreibungsignoranz), verwenden Sie array_diff_ukey().
Fazit
array_diff_key() ist eine fokussierte, schnelle Möglichkeit, ein array anhand der Schlüssel anderer arrays zu filtern. Zwei Regeln, die häufig zu Verwechslungen führen: Die Funktion vergleicht ausschließlich Schlüssel (Werte werden ignoriert), und Schlüssel werden vor dem Vergleich in string umgewandelt. Für wertebewusste Vergleiche siehe array_diff_assoc(), und um einen einzelnen Schlüssel zu prüfen, verwenden Sie array_key_exists().