Beim Arbeiten mit mehreren Arrays stellt sich regelmäßig die Frage, welche Einträge in einem Array vorhanden sind, in einem anderen jedoch fehlen. Während array_diff() die Werte zweier Arrays vergleicht, bietet PHP mit array_diff_key() eine Funktion, die ausschließlich die Schlüssel betrachtet. Das ist besonders nützlich, wenn die Keys die eigentliche Bedeutung tragen, etwa bei assoziativen Arrays mit Konfigurationswerten oder Formulardaten. Dieses Tutorial erklärt die Funktionsweise von array_diff_key(), zeigt den Unterschied zu array_diff() und stellt praxisnahe Anwendungsfälle vor.

Los geht es mit der Syntax und den Parametern der Funktion, gefolgt von anschaulichen Beispielen und dem Vergleich mit array_diff().
Syntax und Parameter
Bevor die Funktion in Beispielen eingesetzt wird, lohnt sich ein genauer Blick auf die Syntax und die erwarteten Parameter.
Die Funktion erwartet mindestens zwei Arrays als Argumente. Das erste Array dient als Ausgangsbasis, alle weiteren Arrays dienen als Vergleichsgrundlage. Zurückgegeben wird ein neues Array, das alle Einträge aus dem ersten Array enthält, deren Schlüssel in keinem der Vergleichs-Arrays vorkommen. Dabei spielen die Werte der Vergleichs-Arrays keine Rolle. Es zählt einzig und allein, ob ein bestimmter Key existiert oder nicht.
<?php
/* Syntax */
array_diff_key(array $array, array ...$arrays): array
Der Rückgabewert enthält immer die Werte aus dem ersten Array. Selbst wenn ein identischer Key in einem Vergleichs-Array einen anderen Wert besitzt, wird dieser Key aus dem Ergebnis entfernt, da er im Vergleichs-Array existiert.
Grundlegendes Beispiel
Ein einfaches Beispiel verdeutlicht das Verhalten von array_diff_key() am besten.
<?php
$array1 = [
'name' => 'Max',
'alter' => 28,
'stadt' => 'Berlin',
'beruf' => 'Entwickler'
];
$array2 = [
'name' => 'Anna',
'stadt' => 'Hamburg'
];
$ergebnis = array_diff_key($array1, $array2);
print_r($ergebnis);
/*
Array
(
[alter] => 28
[beruf] => Entwickler
)
*/
Die Keys name und stadt kommen in beiden Arrays vor und werden deshalb aus dem Ergebnis ausgeschlossen. Übrig bleiben alter und beruf, da diese Schlüssel nur im ersten Array existieren. Dass die Werte in $array2 völlig andere sind (Anna statt Max, Hamburg statt Berlin), spielt dabei keine Rolle.
Mehr als zwei Arrays vergleichen
Die Funktion akzeptiert nicht nur zwei, sondern beliebig viele Arrays als Argumente. Das ermöglicht den gleichzeitigen Abgleich gegen mehrere Datenquellen.
<?php
$alle_felder = [
'vorname' => '',
'nachname' => '',
'email' => '',
'telefon' => '',
'adresse' => ''
];
$pflicht = ['vorname' => true, 'nachname' => true];
$optional = ['email' => true];
$rest = array_diff_key($alle_felder, $pflicht, $optional);
print_r($rest);
/*
Array
(
[telefon] =>
[adresse] =>
)
*/
Alle Keys, die in $pflicht oder $optional vorkommen, werden aus $alle_felder entfernt. Im Ergebnis verbleiben nur die Schlüssel, die in keinem der Vergleichs-Arrays enthalten sind. Diese Technik eignet sich hervorragend, um Kategorien von Feldern schrittweise herauszufiltern.
array_diff_key vs. array_diff
Die Verwechslung von array_diff_key() und array_diff() ist einer der häufigsten Fehler beim Array-Vergleich in PHP. Beide Funktionen liefern eine Differenz, arbeiten jedoch auf völlig unterschiedlichen Ebenen.
Vergleich nach Keys vs. Vergleich nach Values
Das folgende Diagramm veranschaulicht den grundlegenden Unterschied zwischen beiden Funktionen.
flowchart TD
A["Erstes Array: name=Max, alter=28, stadt=Berlin"] --> B{"Vergleichsmethode"}
B -->|"array_diff_key()"| C["Vergleicht die KEYS"]
B -->|"array_diff()"| D["Vergleicht die VALUES"]
C --> E["Entfernt Einträge, deren KEY im zweiten Array existiert"]
D --> F["Entfernt Einträge, deren WERT im zweiten Array existiert"]
Ein konkretes Codebeispiel macht den Unterschied noch greifbarer.
<?php
$array1 = ['a' => 'Apfel', 'b' => 'Birne', 'c' => 'Kirsche'];
$array2 = ['a' => 'Orange', 'd' => 'Birne'];
/* Vergleich nach Keys */
$diff_key = array_diff_key($array1, $array2);
print_r($diff_key);
/*
Array
(
[b] => Birne
[c] => Kirsche
)
*/
/* Vergleich nach Values */
$diff_val = array_diff($array1, $array2);
print_r($diff_val);
/*
Array
(
[a] => Apfel
[c] => Kirsche
)
*/
Bei array_diff_key() wird der Key a entfernt, weil er in beiden Arrays vorkommt. Die Keys b und c bleiben erhalten, weil sie nicht in $array2 existieren. Bei array_diff() hingegen fällt Birne weg, weil dieser Wert in $array2 enthalten ist, unabhängig davon, unter welchem Key er dort gespeichert ist.
Als Gegenstück zu array_diff_key() gibt es übrigens array_intersect_key(). Diese Funktion liefert alle Einträge zurück, deren Keys in allen übergebenen Arrays vorkommen, also die Schnittmenge statt der Differenz.
array_diff_ukey: Eigene Vergleichsfunktion
Manchmal reicht ein einfacher Key-Vergleich nicht aus. In solchen Fällen erlaubt array_diff_ukey() die Übergabe einer eigenen Vergleichsfunktion als Callback.
<?php
$array1 = ['Vorname' => 'Max', 'NACHNAME' => 'Muster', 'Email' => 'max@test.de'];
$array2 = ['vorname' => 'Anna', 'nachname' => 'Schmidt'];
/* Vergleich ohne Beachtung der Groß- und Kleinschreibung */
$ergebnis = array_diff_ukey($array1, $array2, function($key1, $key2) {
return strcasecmp($key1, $key2);
});
print_r($ergebnis);
/*
Array
(
[Email] => max@test.de
)
*/
Die Callback-Funktion erhält zwei Keys als Parameter und muss einen ganzzahligen Wert zurückgeben: kleiner als 0, wenn der erste Key vor dem zweiten steht, 0 bei Gleichheit und größer als 0, wenn der erste Key nach dem zweiten kommt. In diesem Beispiel sorgt strcasecmp() dafür, dass Vorname und vorname als identisch erkannt werden. Nur Email verbleibt im Ergebnis, da kein entsprechender Key im Vergleichs-Array existiert.
Hinweis zu mehrdimensionalen Arrays
Ein wichtiger Punkt beim Einsatz von array_diff_key() ist die Tatsache, dass die Funktion nur eine Ebene tief arbeitet. Verschachtelte Arrays werden nicht rekursiv durchsucht.
Wenn ein Key auf ein Array als Wert zeigt, wird lediglich geprüft, ob der Key selbst im Vergleichs-Array vorkommt. Der Inhalt des verschachtelten Arrays bleibt unberührt. Für einen rekursiven Vergleich muss eine eigene Funktion geschrieben werden, die array_diff_key() auf jeder Ebene separat aufruft.
Praktische Anwendungsfälle
Die Funktion array_diff_key() findet in vielen Bereichen der Webentwicklung Verwendung. Zwei besonders häufige Szenarien werden im Folgenden vorgestellt.
Unerlaubte Formularfelder entfernen
Bei der Verarbeitung von Formulardaten ist es sinnvoll, nur die erwarteten Felder zu akzeptieren und alles andere zu verwerfen. Mit array_diff_key() lassen sich unerlaubte Felder zuverlässig identifizieren.
<?php
$erlaubte_felder = [
'benutzername' => true,
'email' => true,
'passwort' => true
];
/* Simulierte POST-Daten */
$post_daten = [
'benutzername' => 'maxmuster',
'email' => 'max@test.de',
'passwort' => 'geheim123',
'is_admin' => '1',
'rolle' => 'superuser'
];
/* Unerlaubte Felder finden */
$unerlaubt = array_diff_key($post_daten, $erlaubte_felder);
print_r($unerlaubt);
/*
Array
(
[is_admin] => 1
[rolle] => superuser
)
*/
/* Nur erlaubte Felder behalten (mit array_intersect_key) */
$sicher = array_intersect_key($post_daten, $erlaubte_felder);
print_r($sicher);
/*
Array
(
[benutzername] => maxmuster
[email] => max@test.de
[passwort] => geheim123
)
*/
Dieses Muster schützt vor sogenanntem Mass Assignment, bei dem Angreifer zusätzliche Felder in ein Formular einschleusen. Zunächst identifiziert array_diff_key() die unerwünschten Felder. Anschließend filtert array_intersect_key() als Gegenstück die sicheren Felder heraus.
Konfigurationsunterschiede finden
Beim Vergleich von Konfigurationsdateien oder Umgebungsvariablen hilft array_diff_key() dabei, fehlende Einstellungen aufzuspüren.
<?php
$standard_config = [
'db_host' => 'localhost',
'db_name' => 'meinedb',
'db_user' => 'root',
'db_passwort' => '',
'debug_modus' => false,
'cache_dauer' => 3600
];
$aktuelle_config = [
'db_host' => '192.168.1.100',
'db_name' => 'produktionsdb',
'db_user' => 'app_user',
'db_passwort' => 'sicheres_pw'
];
$fehlend = array_diff_key($standard_config, $aktuelle_config);
print_r($fehlend);
/*
Array
(
[debug_modus] =>
[cache_dauer] => 3600
)
*/
/* Fehlende Werte mit Standardwerten ergänzen */
$vollstaendig = array_merge($standard_config, $aktuelle_config);
Zuerst ermittelt array_diff_key() alle Schlüssel, die in der Standard-Konfiguration vorhanden, in der aktuellen Konfiguration jedoch nicht gesetzt sind. Danach füllt array_merge() die fehlenden Einträge mit den Standardwerten auf. So wird sichergestellt, dass jede Konfiguration vollständig ist, ohne dass vorhandene Anpassungen überschrieben werden.
Fazit
Die Funktion array_diff_key() ist ein unverzichtbares Werkzeug für den schlüsselbasierten Vergleich von Arrays in PHP. Sie gibt alle Einträge des ersten Arrays zurück, deren Keys in keinem der Vergleichs-Arrays vorkommen. Im Gegensatz zu array_diff(), die auf Wertebene arbeitet, konzentriert sich array_diff_key() ausschließlich auf die Schlüssel. Wird eine flexible Vergleichslogik benötigt, steht array_diff_ukey() mit benutzerdefiniertem Callback bereit. Als Gegenstück liefert array_intersect_key() die Schnittmenge statt der Differenz. Wichtig bleibt der Hinweis, dass die Funktion nur eine Ebene tief arbeitet und verschachtelte Arrays nicht rekursiv vergleicht.