Start · Sprachen · PHP · Referenz · array_udiff_assoc

array_udiff_assoc

Funktion

Berechnet die Differenz zweier oder mehrerer Arrays unter Berücksichtigung der Schlüssel, wobei die Werte durch eine benutzerdefinierte Callback-Funktion verglichen werden.

seit PHP 5.0.0 Kategorie: array

Signatur

array_udiff_assoc(array $array, array ...$arrays, callable $value_compare_func): array

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

Typ
array
Beschreibung
Gibt ein Array zurück, das alle Einträge aus dem ersten Array enthält, die in keinem der Vergleichs-Arrays mit identischem Schlüssel und identischem Wert (gemäß Callback) vorhanden sind. Die Schlüssel aus dem Ausgangs-Array bleiben erhalten.

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);
Array ( [b] => Banane )

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);
Array ( [kirsche] => 2 )

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);
Array ( [y] => 20 )

// 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.