Start · Sprachen · PHP · Referenz · array_diff_ukey

array_diff_ukey

Funktion

Berechnet die Differenz zweier oder mehrerer Arrays anhand der Schlüssel, wobei ein benutzerdefinierter Callback für den Schlüsselvergleich verwendet wird.

seit PHP 5.1.0 Kategorie: array

Signatur

array_diff_ukey(array $array, array ...$arrays, callable $key_compare_func): array

Beschreibung

array_diff_ukey vergleicht die Schlüssel des ersten Arrays mit den Schlüsseln aller weiteren Arrays und gibt die Einträge des ersten Arrays zurück, deren Schlüssel in keinem der anderen Arrays vorkommen. Der eigentliche Vergleich der Schlüssel erfolgt über eine benutzerdefinierte Callbackfunktion, die das Verhalten von array_diff_key um flexible Vergleichslogik erweitert.

Der Callback erhält zwei Schlüssel als Argumente und muss eine Ganzzahl kleiner, gleich oder größer als 0 zurückgeben – je nachdem, ob der erste Schlüssel kleiner, gleich oder größer als der zweite ist. Dieses Muster ist identisch mit dem Kontrakt einer Sortierfunktion wie strcmp oder einem individuellen Komparator.

Die Funktion ist besonders nützlich, wenn Schlüssel nicht nach dem Standard-PHP-Gleichheitsoperator, sondern nach eigenen Regeln verglichen werden sollen – etwa bei case-insensitivem Vergleich, numerischer Normalisierung oder komplexen Objekt-IDs als Schlüssel.

Die Werte der Elemente spielen für den Vergleich keine Rolle; es werden ausschließlich die Schlüssel herangezogen. Das Ergebnis-Array behält die Original-Schlüssel und -Werte des ersten Arrays bei.

Parameter

Name Typ Default Beschreibung
$array Pflicht array Das Ausgangs-Array, aus dem die Differenz berechnet wird. Nur Elemente dieses Arrays können im Ergebnis erscheinen.
$arrays Pflicht array Ein oder mehrere Arrays, mit denen die Schlüssel des Ausgangs-Arrays verglichen werden. Mindestens ein Array ist erforderlich.
$key_compare_func Pflicht callable Callbackfunktion mit der Signatur callback(mixed $key1, mixed $key2): int. Gibt einen negativen Wert zurück, wenn $key1 kleiner als $key2 ist, 0 bei Gleichheit und einen positiven Wert wenn $key1 größer als $key2 ist.

Rückgabewert

Typ
array
Beschreibung
Gibt ein Array zurück, das alle Einträge aus dem Ausgangs-Array enthält, deren Schlüssel gemäß der Callbackfunktion in keinem der Vergleichs-Arrays vorhanden sind. Die Original-Schlüssel bleiben erhalten.

Beispiele

Schlüsseldifferenz mit case-insensitivem Vergleich

<?php
$array1 = [
    'Alpha' => 1,
    'Beta'  => 2,
    'Gamma' => 3,
    'Delta' => 4,
];

$array2 = [
    'alpha' => 10,
    'GAMMA' => 30,
];

// Vergleich der Schlüssel ohne Beachtung der Groß-/Kleinschreibung
$diff = array_diff_ukey($array1, $array2, 'strcasecmp');

print_r($diff);
Array ( [Beta] => 2 [Delta] => 4 )

Differenz mit numerisch normalisierten Schlüsseln

<?php
$products = [
    '001' => 'Apfel',
    '002' => 'Banane',
    '010' => 'Kirsche',
    '020' => 'Pflaume',
];

$exclude = [
    '1'  => 'irrelevant',
    '10' => 'irrelevant',
];

// Vergleich als ganze Zahlen (führende Nullen ignorieren)
$diff = array_diff_ukey($products, $exclude, function ($a, $b) {
    return (int)$a - (int)$b;
});

print_r($diff);
Array ( [002] => Banane [020] => Pflaume )

Differenz über mehrere Vergleichs-Arrays

<?php
$base = ['foo' => 1, 'bar' => 2, 'baz' => 3, 'qux' => 4];
$excl1 = ['FOO' => 'x'];
$excl2 = ['BAZ' => 'y'];

$result = array_diff_ukey($base, $excl1, $excl2, 'strcasecmp');

print_r($result);
Array ( [bar] => 2 [qux] => 4 )

// Wichtig · Fallstricke

Reihenfolge des Callbacks: Der Callback muss als letztes Argument übergeben werden, nach allen Vergleichs-Arrays. Ein falsches Platzieren führt zu einem TypeError bzw. einem unerwarteten Ergebnis.

Konsistenz des Callbacks: Der Komparator muss eine konsistente Ordnung liefern (transitiv, antisymmetrisch). Inkonsistente Callbacks können zu unvorhersehbaren Ergebnissen führen, da die interne Implementierung auf eine stabile Ordnung angewiesen ist.

Nur Schlüssel werden verglichen: Die Werte der Elemente haben keinen Einfluss auf das Ergebnis. Soll zusätzlich auch der Wert verglichen werden, ist array_diff_uassoc die richtige Wahl.

Alternativen: array_diff_key für Standard-Schlüsselvergleich, array_diff_uassoc für kombinierten Schlüssel-Wert-Vergleich mit Callback und array_intersect_ukey für die komplementäre Schnittmenge.