Signatur
Beschreibung
array_diff_uassoc() vergleicht das erste Array $array mit einem oder mehreren weiteren Arrays und gibt alle Einträge zurück, deren Kombination aus Schlüssel und Wert in keinem der anderen Arrays vorkommt. Der entscheidende Unterschied zu array_diff_assoc() liegt darin, dass der Schlüsselvergleich nicht intern, sondern durch eine vom Entwickler bereitgestellte Callback-Funktion durchgeführt wird.
Die Callback-Funktion muss denselben Vertrag erfüllen wie eine Vergleichsfunktion für usort(): Sie erhält zwei Schlüssel als Argumente und muss eine negative Zahl zurückgeben, wenn der erste kleiner als der zweite ist, 0 bei Gleichheit, und eine positive Zahl, wenn der erste größer ist.
Dies ist besonders nützlich, wenn Schlüssel auf eine nicht-standardmäßige Weise verglichen werden sollen, z. B. case-insensitiv, numerisch normalisiert oder anhand eigener Objekt-IDs.
Beachte, dass der Wertevergleich weiterhin intern (als Zeichenketten) erfolgt – nur der Schlüsselvergleich wird durch die Callback-Funktion gesteuert. Die Funktion gibt ein Array zurück, das alle Schlüssel-Wert-Paare aus dem ersten Array enthält, die in keinem der Vergleichs-Arrays vorhanden sind.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $array Pflicht | array | Das Quell-Array, aus dem die Unterschiede ermittelt werden. | |
| $arrays Pflicht | array | Ein oder mehrere Arrays, mit denen $array verglichen wird. Mindestens eines muss angegeben werden. |
|
| $key_compare_func Pflicht | callable | Eine benutzerdefinierte Vergleichsfunktion für die Schlüssel. Sie erhält zwei Schlüssel und muss einen int zurückgeben: negativ, wenn der erste Schlüssel kleiner ist, 0 bei Gleichheit, positiv wenn größer. |
Rückgabewert
$array enthält, für die keine übereinstimmende Schlüssel-Wert-Kombination in einem der weiteren Arrays gefunden wurde. Die Schlüssel des Quell-Arrays bleiben erhalten.Beispiele
Grundlegende Verwendung mit strcmp als Schlüsselvergleich
<?php
$array1 = ['a' => 'Apfel', 'b' => 'Banane', 'c' => 'Kirsche'];
$array2 = ['A' => 'Apfel', 'b' => 'Birne', 'c' => 'Kirsche'];
// Vergleich mit strcmp (case-sensitiv)
$result = array_diff_uassoc($array1, $array2, 'strcmp');
print_r($result);
// 'a' => 'Apfel' ist drin, weil Schlüssel 'a' != 'A' (case-sensitiv)
// 'b' => 'Banane' ist drin, weil Wert 'Banane' != 'Birne'
// 'c' => 'Kirsche' ist NICHT drin, weil Schlüssel und Wert übereinstimmen
Case-insensitiver Schlüsselvergleich mit strcasecmp
<?php
$array1 = ['Vorname' => 'Anna', 'Nachname' => 'Müller', 'Stadt' => 'Berlin'];
$array2 = ['vorname' => 'Anna', 'nachname' => 'Schmidt', 'STADT' => 'Berlin'];
// strcasecmp ignoriert Groß-/Kleinschreibung bei den Schlüsseln
$result = array_diff_uassoc($array1, $array2, 'strcasecmp');
print_r($result);
// 'Vorname' => 'Anna' fehlt, da Schlüssel (case-insensitiv) gleich UND Wert gleich
// 'Nachname' => 'Müller' bleibt, da Wert 'Müller' != 'Schmidt'
// 'Stadt' => 'Berlin' fehlt, da Schlüssel (case-insensitiv) gleich UND Wert gleich
Eigene Callback-Funktion für numerisch normalisierte Schlüssel
<?php
$preise1 = ['01' => 9.99, '02' => 14.50, '03' => 5.00];
$preise2 = ['1' => 9.99, '2' => 14.50, '4' => 8.00];
// Numerischer Vergleich: '01' == '1', '02' == '2' usw.
$compareNumeric = function(string $a, string $b): int {
return (int)$a - (int)$b;
};
$result = array_diff_uassoc($preise1, $preise2, $compareNumeric);
print_r($result);
// '01' => 9.99 fehlt (nummerisch gleich zu '1', gleicher Wert)
// '02' => 14.50 fehlt (nummerisch gleich zu '2', gleicher Wert)
// '03' => 5.00 bleibt (Schlüssel '3' nicht in $preise2 vorhanden)
// Wichtig · Fallstricke
Reihenfolge der Parameter: Die Callback-Funktion muss als letztes Argument übergeben werden, nach allen zu vergleichenden Arrays. Dies ist ein häufiger Fehler bei Funktionen dieser Familie (array_diff_uassoc, array_diff_ukey etc.).
Nur Schlüsselvergleich benutzerdefiniert: Der Wertevergleich erfolgt intern als Zeichenkettenvergleich. Wenn auch der Wertevergleich benutzerdefiniert sein soll, verwende array_udiff_uassoc().
Verwandte Funktionen im Überblick:
array_diff()— Wertevergleich, Schlüssel werden ignoriertarray_diff_assoc()— Wert- und Schlüsselvergleich, beide internarray_diff_ukey()— nur Schlüsselvergleich benutzerdefiniert, Werte ignoriertarray_udiff_assoc()— Wertevergleich benutzerdefiniert, Schlüsselvergleich internarray_udiff_uassoc()— beide Vergleiche benutzerdefiniert