Signatur
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
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);
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";
}
// 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.