Umfassender Leitfaden zur PHP-Funktion array_uintersect()
Erfahren Sie, wie PHP's array_uintersect() Arrays mit einem benutzerdefinierten Callback vergleicht. Syntax, Beispiele und Anwendungsfälle.
Die Funktion array_uintersect() vergleicht die Werte von zwei oder mehr Arrays und gibt die Werte aus dem ersten array zurück, die auch in jedem anderen array vorhanden sind. Was sie von array_intersect() unterscheidet, ist das u-Präfix: Sie stellen die Vergleichslogik als Callback bereit und steuern damit genau, wann zwei Werte als gleich gelten.
Diese Seite behandelt die Syntax, die Funktionsweise des Vergleichs-Callbacks, ausführbare Beispiele und wann diese Funktion gegenüber einfacheren Alternativen zu bevorzugen ist.
Syntax
array_uintersect(
array $array1,
array $array2,
array ...$arrays,
callable $value_compare_func
): array| Parameter | Beschreibung |
|---|---|
$array1 | Das Basis-array. Seine Schlüssel und Werte werden im Ergebnis beibehalten. |
$array2, ...$arrays | Ein oder mehrere Arrays, mit denen verglichen wird. Ein Wert bleibt nur erhalten, wenn er in allen vorkommt. |
$value_compare_func | Ein Callback, der bestimmt, wann zwei Werte gleich sind. Er ist immer das letzte Argument. |
Die Funktion gibt ein neues array mit den Werten aus $array1 zurück, die in jedem anderen array gefunden wurden, wobei die ursprünglichen Schlüssel aus $array1 erhalten bleiben.
Funktionsweise des Vergleichs-Callbacks
Der Callback erhält zwei Werte und muss eine Ganzzahl zurückgeben:
- einen Wert kleiner als 0, wenn das erste Argument „kleiner als" das zweite ist,
- 0, wenn die beiden Werte als gleich gelten,
- einen Wert größer als 0, wenn das erste „größer als" das zweite ist.
Nur ein Rückgabewert von 0 gilt als Übereinstimmung. Dies ist derselbe dreiwertige Vertrag, der von Sortierfunktionen wie usort() verwendet wird, weshalb das eingebaute strcmp() ein praktischer Callback für Strings ist.
array_uintersect() führt kein eigenes Type-Juggling durch – jede Gleichheitsentscheidung läuft über Ihren Callback. Das bedeutet, Sie können das Matching so locker oder strikt gestalten wie nötig (Groß-/Kleinschreibung ignorieren, typstrikt, objektorientiert usw.).
Ein einfacher string-Callback sieht so aus:
function compare_strings($string1, $string2) {
return strcmp($string1, $string2);
}Einfaches Beispiel
Hier schneiden wir drei Arrays mit Fruchtnamen mithilfe des obigen Callbacks:
<?php
function compare_strings($string1, $string2) {
return strcmp($string1, $string2);
}
$array1 = array("apple", "orange", "banana");
$array2 = array("orange", "banana", "kiwi");
$array3 = array("banana", "kiwi", "grape");
$result = array_uintersect($array1, $array2, $array3, "compare_strings");
print_r($result);
?>Ausgabe:
Array
(
[2] => banana
)Nur "banana" kommt in allen drei Arrays vor. Beachten Sie, dass der Schlüssel 2 ist – das ist der ursprüngliche Index in $array1, der im Ergebnis erhalten bleibt. "orange" wird ausgeschlossen, da es in $array3 fehlt.
Groß-/Kleinschreibung ignorieren
Da der Callback die gesamte Vergleichslogik übernimmt, macht der Austausch gegen strcasecmp() die Schnittmenge unabhängig von der Groß-/Kleinschreibung:
<?php
$a = ["Red", "GREEN", "Blue"];
$b = ["red", "green", "yellow"];
$result = array_uintersect($a, $b, "strcasecmp");
print_r($result);
?>Ausgabe:
Array
(
[0] => Red
[1] => GREEN
)"Red" und "GREEN" werden beibehalten, weil strcasecmp() sie als gleich mit "red" und "green" behandelt. Die zurückgegebenen Werte stammen aus dem ersten array, sodass die ursprüngliche Schreibweise erhalten bleibt.
Wann array_uintersect() verwenden?
Greifen Sie auf diese Funktion zurück, wenn:
- Sie die Schnittmenge von array-Werten (nicht Schlüsseln) benötigen, und
- eine einfache Gleichheitsprüfung nicht ausreicht – die Werte sind Objekte, gemischte Typen oder benötigen unscharfes/normalisiertes Matching.
Wenn Sie Werte nur mit PHPs Standard-Vergleich prüfen müssen, ist array_intersect() einfacher. Wenn Schlüssel ebenfalls wichtig sind, siehe array_uintersect_assoc(), und für Differenzen (statt Schnittmengen) mit einem Callback siehe array_udiff().
Wesentliche Vorteile:
- Gemeinsame Elemente über viele Arrays hinweg in einem Aufruf finden, ohne manuelle Schleifen.
- Ursprüngliche Schlüssel aus dem ersten array werden für einfacheres Datenmapping beibehalten.
- Benutzerdefinierte Vergleichslogik verarbeitet komplexe Datentypen und spezifische Matching-Regeln.
Fazit
array_uintersect() ist das richtige Werkzeug, wenn Sie die gemeinsamen Werte mehrerer Arrays benötigen, aber PHPs eingebauter Vergleich nicht Ihrer Definition von Gleichheit entspricht. Definieren Sie einen Callback, der 0 für gleiche Werte zurückgibt, übergeben Sie ihn als letztes Argument, und die Funktion gibt die übereinstimmenden Werte aus dem ersten array mit ihren Schlüsseln zurück.