PHP array_diff_assoc Funktion
Die PHP-Funktion array_diff_assoc vergleicht zwei oder mehr Arrays und gibt die Unterschiede anhand von Schlüsseln und Werten zurück.
Die PHP-Funktion array_diff_assoc() vergleicht zwei oder mehr Arrays und gibt die Einträge des ersten Arrays zurück, die in keinem der anderen vorhanden sind. Anders als array_diff(), die nur Werte betrachtet, prüft array_diff_assoc() sowohl den Schlüssel als auch den Wert — ein Paar überlebt den Vergleich nur, wenn kein anderes Array denselben Schlüssel mit demselben Wert enthält. Damit ist sie das richtige Werkzeug für den Vergleich assoziativer Arrays.
Diese Seite behandelt die Syntax, wie der Schlüssel-Wert-Abgleich funktioniert, den Unterschied zu array_diff(), die Besonderheit beim (string-)basierten Vergleich und ein Beispiel mit mehreren Arrays.
Syntax
array_diff_assoc(array $array, array ...$arrays): array$array— das Array, aus dem verglichen wird. Die verbleibenden Einträge bilden das Ergebnis....$arrays— ein oder mehrere Arrays, gegen die verglichen wird.
Die Funktion gibt ein neues Array zurück, das alle Schlüssel-Wert-Paare aus $array enthält, die in keinem der anderen Arrays (mit demselben Schlüssel) vorkommen. Schlüssel bleiben im Ergebnis erhalten.
Funktionsweise
array_diff_assoc() durchläuft das erste Array und fragt für jedes Paar: Enthält irgendein anderes Array denselben Schlüssel mit demselben Wert? Wenn ja, wird das Paar entfernt; wenn nein, bleibt es erhalten.
PHP array_diff_assoc() Beispiel
Ausgabe:
Array
(
[b] => banana
)Nur "b" => "banana" bleibt übrig: $array2 hat keinen Schlüssel b. Die Paare a und c stimmen sowohl im Schlüssel als auch im Wert überein und werden daher entfernt. "d" => "date" in $array2 ist irrelevant — im Ergebnis können nur Einträge aus dem ersten Array erscheinen.
array_diff_assoc() vs array_diff()
Der wesentliche Unterschied liegt darin, ob Schlüssel Teil des Vergleichs sind. Wenn derselbe Wert unter unterschiedlichen Schlüsseln vorliegt, behandelt array_diff() die Einträge als gleich, array_diff_assoc() jedoch nicht:
<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("x" => "apple");
print_r(array_diff_assoc($a, $b)); // compares key AND value
print_r(array_diff($a, $b)); // compares value only
?>Ausgabe:
Array
(
[a] => apple
[b] => banana
)
Array
(
[b] => banana
)array_diff_assoc() behält "a" => "apple", weil $b den Wert apple unter dem Schlüssel x speichert, nicht unter a. array_diff() entfernt ihn, weil der Wert apple irgendwo in $b vorhanden ist.
Besonderheit: Vergleich erfolgt als string
Intern vergleicht array_diff_assoc() Werte lose durch Umwandlung in strings — (string) $elem1 === (string) $elem2. Das bedeutet, 10 (int) und "10" (string) gelten als gleich:
<?php
$a = array("x" => 10);
$b = array("x" => "10");
print_r(array_diff_assoc($a, $b));
?>Ausgabe:
Array
(
)Das Ergebnis ist leer: 10 und "10" ergeben beim Umwandeln den gleichen string "10". Wenn ein strikt typbasierter Vergleich benötigt wird, kann man eine Callback-Funktion mit array_udiff_assoc() verwenden (oder Typen selbst prüfen). Für den Vergleich nur nach Schlüsseln eignet sich array_diff_key().
Vergleich von mehr als zwei Arrays
Es kann eine beliebige Anzahl von Arrays übergeben werden. Ein Eintrag muss in allen anderen Arrays fehlen, um erhalten zu bleiben. Das funktioniert auch mit numerischen Schlüsseln:
<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
print_r(array_diff_assoc($array1, $array2));
?>Ausgabe:
Array
(
[b] => brown
[c] => blue
[0] => red
)"a" => "green" stimmt überein und wird entfernt. [0] => "red" bleibt, weil in $array2 der Wert "red" unter Schlüssel 1 und nicht unter 0 steht — das Schlüssel-Wert-Paar unterscheidet sich also.
Wann sollte sie verwendet werden?
- Beim Vergleich von Konfigurations- oder Einstellungs-Arrays, bei denen der Schlüssel relevant ist (z. B. zum Erkennen geänderter Optionen).
- Zum Finden von Einträgen, die aus einem früheren Snapshot entfernt wurden, wenn sowohl Schlüssel- als auch Wertidentität wichtig sind.
- Bei jedem Vergleich, bei dem ein rein wertbasierter Vergleich (
array_diff()) falsch-positive Ergebnisse liefern würde.
Verwandte Funktionen
array_diff()— vergleicht nur nach Wert.array_diff_key()— vergleicht nur nach Schlüssel.array_intersect_assoc()— das Gegenteil: behält Einträge, die in allen Arrays nach Schlüssel und Wert vorhanden sind.