W3docs

Die PHP-Funktion array_udiff() verstehen

Wie PHP's array_udiff() Arrays per Callback vergleicht und Werte zurückgibt, die nur im ersten array vorkommen. Beispiele mit Zahlen und Objekten.

array_udiff() berechnet die Differenz zwischen arrays, indem es deren Werte mit einer Callback-Funktion vergleicht, die Sie bereitstellen. Es gibt die Werte zurück, die im ersten array vorhanden sind, aber in keinem der anderen arrays gefunden werden. Das „u" im Namen steht für benutzerdefiniert — anders als array_diff(), das Werte als string vergleicht, können Sie mit array_udiff() selbst festlegen, wann zwei Werte als „gleich" gelten.

Diese Seite behandelt die Syntax der Funktion, die Funktionsweise des Callbacks, ausführbare Beispiele mit Zahlen und Objekten sowie häufige Fallstricke.

Wann sollte man array_udiff() verwenden?

Greifen Sie auf array_udiff() zurück, wenn der Standardvergleich in array_diff() zu ungenau ist:

  • Objekte. array_diff() wandelt jeden Wert in einen string um. Objekte ohne __toString()-Methode können so nicht verglichen werden – Sie benötigen einen Callback, der stattdessen eine Eigenschaft prüft.
  • Benutzerdefinierte Gleichheit. Sie möchten einen Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung, einen Vergleich nach einem einzelnen Feld oder einen toleranzbasierten Zahlenvergleich durchführen.
  • Gemischte oder normalisierte Daten. Sie möchten "5", 5 und 5.0 als denselben Wert behandeln oder Gleitkommazahlen mit Rundung vergleichen.

Wenn Sie nur einen einfachen string-Vergleich benötigen, verwenden Sie lieber das einfachere array_diff().

Wie array_udiff() funktioniert

Die Funktion nimmt zwei oder mehr arrays entgegen, wobei das letzte Argument der Vergleichs-Callback ist. Sie gibt ein array der Werte aus dem ersten array zurück, die der Callback als nicht gleich zu einem Wert in den späteren arrays einstuft. Schlüssel und Reihenfolge aus dem ersten array bleiben erhalten.

Syntax

array_udiff(array $array1, array $array2, array ...$arrays, callable $value_compare_func): array
  • array $array1 — das array, dessen Werte zurückgegeben werden (das „Basis"-array).
  • array $array2 — ein array, mit dem verglichen wird.
  • array ...$arrays — beliebig viele weitere arrays, mit denen verglichen wird.
  • callable $value_compare_func — der Vergleichs-Callback. Er ist immer das letzte Argument.

Der Vergleichs-Callback

Der Callback erhält zwei Werte und muss einen Integer zurückgeben:

  • eine Zahl kleiner als 0, wenn der erste Wert „kleiner" ist,
  • 0, wenn die beiden Werte als gleich gelten,
  • eine Zahl größer als 0, wenn der erste Wert „größer" ist.

Die Rückgabe von 0 markiert zwei Werte als gleich – ein Wert in $array1 wird also aus dem Ergebnis ausgeschlossen, wenn der Callback 0 für ihn im Vergleich mit einem Wert in einem späteren array zurückgibt. Die Ergebnisse < 0 / > 0 ermöglichen PHP, die Werte intern effizient zu sortieren — es ist wichtig, sie korrekt zu liefern, also nicht einfach 0 oder 1 zurückgeben. Der Raumschiff-Operator (<=>) ist der einfachste und korrekte Weg, diesen Wert zu erzeugen.

Beispiel 1: Zwei arrays mit Zahlen vergleichen

Dieses Beispiel verwendet eine benannte Funktion als Callback, um Zahlen zu finden, die in $array1, aber nicht in $array2 enthalten sind:

<?php

function compare_numbers($a, $b) {
    if ($a == $b) {
        return 0;
    } elseif ($a < $b) {
        return -1;
    } else {
        return 1;
    }
}

$array1 = [1, 2, 3, 4, 5];
$array2 = [2, 4, 6];

$result = array_udiff($array1, $array2, 'compare_numbers');

print_r($result);

?>

compare_numbers() gibt 0 zurück, wenn zwei Werte übereinstimmen, sodass die übereinstimmenden Zahlen (2 und 4) entfernt werden. Das Ergebnis behält die ursprünglichen Schlüssel aus $array1:

Array
(
    [0] => 1
    [2] => 3
    [4] => 5
)

Der gesamte Callback könnte durch eine einzeilige Funktion mit dem Raumschiff-Operator ersetzt werden: fn($a, $b) => $a <=> $b.

Beispiel 2: arrays von Objekten vergleichen

Dies ist der Fall, den array_diff() nicht bewältigen kann. Hier vergleichen wir zwei arrays von Product-Objekten anhand ihrer id und geben die Produkte zurück, die nicht in der zweiten Liste enthalten sind:

<?php

class Product {
    public function __construct(public int $id, public string $name) {}
}

$catalog = [
    new Product(1, 'Keyboard'),
    new Product(2, 'Mouse'),
    new Product(3, 'Monitor'),
];

$discontinued = [
    new Product(2, 'Mouse'),
];

$available = array_udiff(
    $catalog,
    $discontinued,
    fn(Product $a, Product $b) => $a->id <=> $b->id
);

foreach ($available as $product) {
    echo $product->id . ': ' . $product->name . PHP_EOL;
}

?>

Dadurch werden die Produkte ausgegeben, deren id nicht in $discontinued vorhanden ist:

1: Keyboard
3: Monitor

Da der Callback nur die id vergleicht, sind die unterschiedlichen name-Werte irrelevant — die Vergleichslogik liegt vollständig in Ihrer Hand.

Wichtige Hinweise

  • Der Callback ist immer das letzte Argument, egal wie viele arrays übergeben werden.
  • array_udiff() vergleicht Werte. Um sowohl nach Schlüsseln als auch nach Werten zu vergleichen, verwenden Sie array_udiff_assoc(); um Schlüssel ebenfalls per Callback zu vergleichen, verwenden Sie array_udiff_uassoc().
  • Geben Sie ein korrektes dreigliedriges Ergebnis zurück (negativ / 0 / positiv), nicht nur 0 oder 1. PHP nutzt die Reihenfolge für einen effizienten Vergleich, und ein fehlerhafter Callback kann zu falschen Ergebnissen führen.
  • Das Ergebnis behält die Schlüssel und die Reihenfolge von $array1 bei. Rufen Sie array_values() auf, wenn Sie ein neu indiziertes array möchten.
  • Im Ergebnis können nur Werte aus dem ersten array erscheinen — Werte, die ausschließlich in späteren arrays vorkommen, werden nie zurückgegeben.

Verwandte Funktionen

Übungen

Übung
Was ist der Zweck der Funktion array_udiff() in PHP?
Was ist der Zweck der Funktion array_udiff() in PHP?
Was this page helpful?