W3docs

Ein umfassender Leitfaden zur PHP-Funktion array_uintersect_assoc

Erfahren Sie, wie PHP array_uintersect_assoc() die Schnittmenge von Arrays mit Indexprüfung und benutzerdefinierter Wertvergleichs-Callback berechnet.

array_uintersect_assoc() berechnet die Schnittmenge von zwei oder mehr Arrays mit einer zusätzlichen Indexprüfung, wobei die Werte durch einen von Ihnen bereitgestellten Callback verglichen werden, die Schlüssel jedoch mit dem eingebauten (losen) Vergleich. Es gibt die Einträge des ersten Arrays zurück, deren Schlüssel und Wert auch in jedem anderen array vorkommen.

Das „u" im Namen steht für benutzerdefinierter Wertvergleich; das Suffix _assoc bedeutet Schlüssel werden ebenfalls geprüft. Ein Element überlebt also nur, wenn beide der folgenden Bedingungen zutreffen:

  • sein Schlüssel existiert in allen anderen Arrays (verglichen nach PHPs Standardvergleich), und
  • Ihr Callback meldet seinen Wert als gleich zum entsprechenden Element in jedem anderen array.

Dies macht sie zur strikten Verwandten von array_intersect(), die Schlüssel ignoriert und Zeichenfolgenvergleich verwendet. Verwenden Sie array_uintersect_assoc(), wenn übereinstimmende Schlüssel wichtig sind und Sie benutzerdefinierten Wertabgleich benötigen — zum Beispiel Groß-/Kleinschreibung-unempfindlichen Abgleich, den Vergleich von Objekten oder den Abgleich von Zahlen mit einer Toleranz.

Syntax

array_uintersect_assoc(array $array1, array $array2, ...$arrays, callable $value_compare_func): array

Der Callback ist immer das letzte Argument. Alles davor ist ein zu schneidender array.

Parameter

ParameterBeschreibung
$array1Der Basis-array. Schlüssel und Werte aus diesem array werden im Ergebnis beibehalten.
$array2, ...Ein oder mehrere Arrays, mit denen $array1 verglichen wird.
$value_compare_funcEin Callback, der zwei Werte vergleicht und eine ganze Zahl zurückgibt.

Rückgabewert

Ein assoziativer array, der jeden Eintrag von $array1 enthält, dessen Schlüssel in allen anderen Arrays vorhanden ist und dessen Wert der Callback in allen Arrays als gleich betrachtet. Schlüssel werden aus $array1 übernommen.

Die Callback-Funktion

Der Callback empfängt zwei Werte und muss eine ganze Zahl zurückgeben, die sie ordnet – genau wie die Vergleichsfunktionen, die von usort() verwendet werden:

  • 0, wenn die beiden Werte als gleich betrachtet werden,
  • eine negative Zahl (< 0), wenn der erste „kleiner als" der zweite ist,
  • eine positive Zahl (> 0), wenn der erste „größer als" der zweite ist.

Zwei Werte werden nur dann als Treffer behandelt, wenn der Callback 0 zurückgibt. Eingebaute Funktionen wie strcasecmp() (Zeichenfolgenvergleich ohne Berücksichtigung der Groß-/Kleinschreibung) und strcmp() folgen diesem Vertrag bereits, weshalb sie direkt übergeben werden können.

Beispiele

Beispiel 1: Einfache Schnittmenge über drei Arrays

php— editable, runs on the server

Ausgabe:

Array
(
    [c] => cherry
)

Nur c => cherry überlebt. apple ist in $array1 und $array3, fehlt aber in $array2; banana ist in $array1 und $array2, fehlt aber in $array3. Nur cherry erscheint unter dem gleichen Schlüssel c in allen drei Arrays, sodass es der einzige Treffer ist. Beachten Sie, dass der Schlüssel c aus $array1 übernommen wird.

Beispiel 2: Groß-/Kleinschreibung-unempfindlicher Wertabgleich

php— editable, runs on the server

Ausgabe:

Array
(
    [c] => Cherry
)

Die Werte unterscheiden sich in der Schreibweise der Arrays (Cherry vs. cherry), aber weil strcasecmp Groß-/Kleinschreibung-unempfindlich vergleicht, meldet der Callback sie dennoch als gleich. Das Ergebnis behält den Wert so bei, wie er in $array1 erscheint (Cherry).

Beispiel 3: Warum die Indexprüfung wichtig ist

Der „assoc"-Teil ist am einfachsten zu erkennen, wenn der gleiche Wert unter verschiedenen Schlüsseln steht:

<?php

$array1 = array('x' => 'red', 'y' => 'green', 'z' => 'blue');
$array2 = array('x' => 'red', 'w' => 'green', 'z' => 'BLUE');

$result = array_uintersect_assoc($array1, $array2, "strcasecmp");

print_r($result);

?>

Ausgabe:

Array
(
    [x] => red
    [z] => blue
)

red stimmt überein, weil es in beiden Arrays den Schlüssel x teilt. blue/BLUE stimmt überein, weil sie den Schlüssel z teilen und strcasecmp die Groß-/Kleinschreibung ignoriert. Aber green wird verworfen: Es steht unter Schlüssel y im ersten array und Schlüssel w im zweiten, sodass die Schlüssel nicht übereinstimmen. Wenn Sie hier den einfachen array_uintersect() verwenden würden, wäre green enthalten, da Schlüssel ignoriert werden.

Verwandte Funktionen

Fazit

array_uintersect_assoc() behält die Einträge des ersten Arrays, deren Schlüssel in jedem anderen array vorkommt und deren Wert der Callback in allen Arrays als gleich behandelt. Greifen Sie darauf zurück, wenn Schlüssel bedeutsam sind und die Wertübereinstimmung benutzerdefinierte Logik erfordert. Wenn Sie auch die Kontrolle über den Schlüsselvergleich benötigen, verwenden Sie array_uintersect_uassoc(); wenn ein Zeichenfolgenvergleich der Werte ausreicht, erledigt das einfachere array_intersect_assoc() die Aufgabe.

Übungen

Übung
Was macht die Funktion array_uintersect_assoc() in PHP?
Was macht die Funktion array_uintersect_assoc() in PHP?
Was this page helpful?