Signatur
Beschreibung
array_uintersect gibt ein Array zurück, das alle Elemente enthält, die in $array und in allen weiteren übergebenen Arrays vorhanden sind. Im Gegensatz zur Standardfunktion array_intersect wird der Vergleich der Werte nicht intern, sondern durch eine benutzerdefinierte Callback-Funktion durchgeführt. Die Schlüssel bleiben dabei erhalten.
Die Callback-Funktion muss zwei Argumente entgegennehmen und einen Integer zurückgeben: negativ, wenn das erste Argument kleiner als das zweite ist, 0 bei Gleichheit, und positiv, wenn das erste Argument größer ist – analog zu strcmp oder dem Raumschiff-Operator <=>.
Besonders nützlich ist diese Funktion, wenn Elemente nach einer eigenen Logik verglichen werden sollen – z. B. case-insensitive Vergleiche, Vergleiche von Objekten nach bestimmten Eigenschaften oder normalisierte Stringvergleiche (z. B. nach Trim oder Transliteration).
Die Schlüssel des ersten Arrays werden im Ergebnis beibehalten. Es werden nur Werte verglichen, nicht Schlüssel – für einen Schlüssel-Wert-Vergleich steht array_uintersect_assoc zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $array Pflicht | array | Das Ausgangs-Array, dessen Werte mit allen weiteren Arrays verglichen werden. | |
| $arrays Pflicht | array | Ein oder mehrere Arrays, mit denen der Vergleich durchgeführt wird. Mindestens ein weiteres Array ist erforderlich. | |
| $value_compare_func Pflicht | callable | Eine Callback-Funktion, die zwei Werte vergleicht. Muss einen negativen Integer zurückgeben, wenn der erste Wert kleiner ist, 0 bei Gleichheit, und einen positiven Integer, wenn der erste Wert größer ist. |
Rückgabewert
$array enthält, die gemäß der Callback-Funktion auch in allen weiteren übergebenen Arrays vorkommen. Die Originalschlüssel des ersten Arrays bleiben erhalten.Beispiele
Case-insensitiver Schnittmengen-Vergleich
<?php
$a = ['Apple', 'Banana', 'Cherry', 'Date'];
$b = ['apple', 'cherry', 'elderberry'];
$result = array_uintersect($a, $b, function ($x, $y) {
return strcasecmp($x, $y);
});
print_r($result);
Schnittmenge von Objekten nach einer Eigenschaft
<?php
class Produkt {
public function __construct(public string $sku, public string $name) {}
}
$lager1 = [
new Produkt('A1', 'Tasse'),
new Produkt('B2', 'Teller'),
new Produkt('C3', 'Löffel'),
];
$lager2 = [
new Produkt('B2', 'Teller (neu)'),
new Produkt('C3', 'Löffel'),
new Produkt('D4', 'Gabel'),
];
$result = array_uintersect($lager1, $lager2, function ($a, $b) {
return strcmp($a->sku, $b->sku);
});
foreach ($result as $p) {
echo $p->sku . ': ' . $p->name . PHP_EOL;
}
Vergleich nach normalisierten Werten (Trim)
<?php
$a = [' hallo', 'welt ', ' php'];
$b = ['hallo', 'php', 'world'];
$result = array_uintersect($a, $b, function ($x, $y) {
return strcmp(trim($x), trim($y));
});
print_r($result);
// Wichtig · Fallstricke
Reihenfolge der Argumente: Die Callback-Funktion muss als letztes Argument übergeben werden, auch wenn mehrere Arrays übergeben werden. Wird sie an falscher Position übergeben, führt dies zu einem Fehler.
Leistungshinweis: Da die Callback-Funktion für jeden Vergleich aufgerufen wird, kann bei sehr großen Arrays die Performance spürbar schlechter sein als bei array_intersect. Bei großen Datenmengen sollte die Callback-Funktion daher möglichst effizient implementiert werden.
Schlüsselerhalt: Die Schlüssel des ersten Arrays bleiben im Ergebnis unverändert erhalten. Dies kann bei numerisch indizierten Arrays zu Lücken führen, die ggf. mit array_values neu indiziert werden sollten.