Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
 
 
 

PHP array_diff_key: Arrays anhand ihrer Keys vergleichen

Sie befinden sich: Home > Php Tutorial > PHP array_diff_key: Arrays...

PHP array_diff_key: Arrays anhand ihrer Keys vergleichen


Eintrag am:  19.03.2026
Hits / Besucher:  23
Sprache:  Deutsch
Kategorie:  Fortgeschrittene...
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

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.

Illustration zum Tutorial: PHP array_diff_key: Arrays anhand ihrer Keys vergleichen

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.

 

Tags:

 

Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.