Signatur
Beschreibung
array_udiff_assoc() vergleicht das erste Array ($array) mit einem oder mehreren weiteren Arrays und gibt alle Elemente zurück, die nur im ersten Array vorhanden sind. Im Gegensatz zu array_udiff() werden dabei sowohl die Schlüssel als auch die Werte berücksichtigt. Der Wertevergleich erfolgt über eine benutzerdefinierte Callback-Funktion, während die Schlüssel intern (standardmäßig als Strings) verglichen werden.
Die Callback-Funktion muss denselben Konventionen folgen wie ein usort()-Callback: Sie erhält zwei Werte und muss einen Integer kleiner als 0, gleich 0 oder größer als 0 zurückgeben, je nachdem ob der erste Wert kleiner, gleich oder größer als der zweite ist. Nur wenn Schlüssel und Wert übereinstimmen, gilt ein Element als vorhanden und wird aus der Ergebnismenge ausgeschlossen.
Die Funktion ist besonders nützlich, wenn man mit komplexen Datenstrukturen arbeitet, bei denen die eingebauten Vergleichsoperatoren nicht ausreichen – etwa beim Vergleich von Objekten, Dezimalzahlen mit Toleranz oder länderspezifischen Zeichenketten. Das Ergebnis-Array behält die originalen Schlüssel aus dem ersten Array bei.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $array Pflicht | array | Das Ausgangs-Array, aus dem die Differenz ermittelt wird. | |
| $arrays Pflicht | array | Ein oder mehrere Arrays, mit denen das Ausgangs-Array verglichen wird. Mindestens ein weiteres Array muss angegeben werden. | |
| $value_compare_func Pflicht | callable | Eine Callback-Funktion zum Vergleich der Array-Werte. Sie erhält zwei Parameter und muss einen Integer kleiner 0, gleich 0 oder größer 0 zurückgeben. Die Signatur lautet: callback(mixed $a, mixed $b): int. |
Rückgabewert
Beispiele
Einfacher Vergleich mit benutzerdefiniertem String-Vergleich
<?php
$array1 = ['a' => 'Apfel', 'b' => 'Banane', 'c' => 'Kirsche'];
$array2 = ['a' => 'Apfel', 'b' => 'Birne', 'c' => 'Kirsche'];
$differenz = array_udiff_assoc($array1, $array2, function ($v1, $v2) {
return strcmp($v1, $v2);
});
print_r($differenz);
Vergleich von Preisen mit Toleranz (Float-Werte)
<?php
$preise1 = ['apfel' => 1.00, 'birne' => 1.50, 'kirsche' => 2.00];
$preise2 = ['apfel' => 1.01, 'birne' => 1.50, 'kirsche' => 1.95];
// Werte gelten als gleich, wenn Differenz < 0.05
$differenz = array_udiff_assoc($preise1, $preise2, function ($a, $b) {
$diff = $a - $b;
if (abs($diff) < 0.05) {
return 0;
}
return ($diff > 0) ? 1 : -1;
});
print_r($differenz);
Vergleich mit mehreren Arrays
<?php
$basis = ['x' => 10, 'y' => 20, 'z' => 30];
$menge1 = ['x' => 10, 'y' => 99];
$menge2 = ['z' => 30];
$differenz = array_udiff_assoc($basis, $menge1, $menge2, function ($a, $b) {
return $a <=> $b;
});
print_r($differenz);
// Wichtig · Fallstricke
Reihenfolge der Parameter: Die Callback-Funktion muss als letzter Parameter übergeben werden. Alle dazwischenliegenden Parameter werden als Vergleichs-Arrays interpretiert.
Nur Werte werden per Callback verglichen: Die Schlüssel werden intern als Strings verglichen (wie bei array_diff_assoc()). Wenn auch die Schlüssel per Callback verglichen werden sollen, ist array_udiff_uassoc() die richtige Wahl.
Performance: Da für jeden Wertevergleich ein PHP-Callable aufgerufen wird, kann die Funktion bei sehr großen Arrays deutlich langsamer sein als die eingebauten Vergleichsfunktionen. Bei einfachen skalaren Werten ist array_diff_assoc() vorzuziehen.