Start · Sprachen · PHP · Referenz · array_uintersect_assoc

array_uintersect_assoc

Funktion

Ermittelt die Schnittmenge mehrerer Arrays unter Berücksichtigung der Schlüssel, wobei die Werte über eine benutzerdefinierte Callback-Funktion verglichen werden.

seit PHP 5.0.0 Kategorie: array

Signatur

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

Beschreibung

array_uintersect_assoc gibt ein Array zurück, das alle Elemente enthält, die sowohl im ersten Array als auch in allen weiteren übergebenen Arrays vorhanden sind – und zwar sowohl nach Schlüssel (Index) als auch nach Wert. Der Schlüsselvergleich erfolgt intern (wie bei array_intersect_assoc), während der Wertevergleich durch eine benutzerdefinierte Callback-Funktion durchgeführt wird.

Die Callback-Funktion muss zwei Parameter entgegennehmen und eine ganze Zahl zurückgeben: einen negativen Wert, wenn das erste Argument kleiner als das zweite ist, 0 bei Gleichheit, und einen positiven Wert, wenn das erste Argument größer ist. Dieses Verhalten entspricht dem Rückgabewert von strcmp oder dem Raumschiff-Operator <=>.

Die Funktion ist besonders nützlich, wenn Objekte, case-insensitive Strings oder andere nicht-triviale Werte verglichen werden sollen, bei denen der Standard-Vergleich nicht ausreicht. Im Gegensatz zu array_uintersect wird hier zusätzlich sichergestellt, dass auch die Schlüssel übereinstimmen.

  • Nur Elemente, deren Schlüssel und Wert in allen Arrays übereinstimmen, werden im Ergebnis behalten.
  • Das Ergebnis-Array enthält die Schlüssel-Wert-Paare aus dem ersten übergebenen Array.

Parameter

Name Typ Default Beschreibung
$array Pflicht array Das Ausgangs-Array, dessen Elemente auf Vorhandensein in den anderen Arrays geprüft werden.
$arrays Pflicht array Ein oder mehrere weitere Arrays, mit denen der Vergleich durchgeführt wird. Mindestens ein weiteres Array ist erforderlich.
$value_compare_func Pflicht callable Eine Callback-Funktion für den Wertevergleich. Sie erhält zwei Werte und muss 0 zurückgeben, wenn sie gleich sind, einen negativen Wert wenn das erste Argument kleiner ist, und einen positiven Wert wenn das erste Argument größer ist.

Rückgabewert

Typ
array
Beschreibung
Gibt ein Array zurück, das alle Werte des ersten Arrays enthält, die – bei gleichzeitiger Übereinstimmung der Schlüssel – auch in allen anderen Arrays vorhanden sind. Die Schlüssel bleiben erhalten.

Beispiele

Einfache Schnittmenge mit case-insensitivem Vergleich

<?php
$array1 = ['a' => 'Apfel', 'b' => 'Banane', 'c' => 'Kirsche'];
$array2 = ['a' => 'apfel', 'b' => 'Mango',  'c' => 'kirsche'];

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

print_r($result);
Array ( [a] => Apfel [c] => Kirsche )

Objekte mit benutzerdefinierter Vergleichsmethode

<?php
class Produkt {
    public function __construct(public string $name, public float $preis) {}
}

$vergleich = function(Produkt $a, Produkt $b): int {
    return $a->preis <=> $b->preis;
};

$angebot1 = [
    'p1' => new Produkt('Laptop', 999.99),
    'p2' => new Produkt('Maus',    19.99),
    'p3' => new Produkt('Monitor', 349.99),
];

$angebot2 = [
    'p1' => new Produkt('Laptop',  999.99),
    'p2' => new Produkt('Tastatur', 49.99),
    'p3' => new Produkt('Monitor', 299.00),
];

$schnittmenge = array_uintersect_assoc($angebot1, $angebot2, $vergleich);

foreach ($schnittmenge as $key => $produkt) {
    echo "$key: {$produkt->name} – {$produkt->preis} EUR\n";
}
p1: Laptop – 999.99 EUR

// Wichtig · Fallstricke

Achtung: Der letzte Parameter muss zwingend die Callback-Funktion sein. Die Reihenfolge der Argumente lautet: erstes Array, beliebig viele weitere Arrays, dann die Callback-Funktion. Eine falsche Reihenfolge führt zu einem Fehler.

Der Schlüsselvergleich erfolgt intern (mit striktem Zeichenkettenvergleich). Für einen benutzerdefinierten Schlüsselvergleich sollte stattdessen array_uintersect_uassoc verwendet werden.

Die Callback-Funktion muss konsistent sein (transitiv und reflexiv), andernfalls sind die Ergebnisse undefiniert. Es empfiehlt sich, den Raumschiff-Operator <=> zu nutzen, um korrekte Vergleichsfunktionen zu schreiben.