array_unique($array) liefert das Array ohne doppelte Werte. Das erste Vorkommen jedes Werts bleibt unter seinem ursprünglichen Schlüssel stehen, und die späteren Kopien werden verworfen.
Das erste Ergebnis behält die Schlüssel 0, 1, 3: die Positionen, an denen jeder Wert zuerst auftauchte. Setze den Aufruf in array_values(), wenn du eine saubere Liste willst, zum Beispiel vor json_encode.
Wie array_unique entscheidet, dass zwei Werte gleich sind
Standardmäßig wird jeder Wert in einen String umgewandelt, und die Strings werden verglichen. Also zählen 1, "1" und 1.0 als derselbe Wert, und der erste gewinnt. Das zweite Argument ändert den Vergleich.
| Flag | Zwei Werte sind Duplikate, wenn |
|---|---|
SORT_STRING (Standard) | (string) $a === (string) $b |
SORT_REGULAR | $a == $b |
SORT_NUMERIC | sie als Zahlen gleich sind |
Mit dem Standard bleibt "01" erhalten, weil der String "01" nicht der String "1" ist. Mit SORT_REGULAR fällt er weg, weil "01" == 1 wahr ist. Der lockere Vergleich lässt außerdem den Boolean true zu jedem nicht leeren Wert passen. Prüfe bei gemischten Typen die Ausgabe, bevor du dich darauf verlässt; die Seite zu Vergleichsoperatoren erklärt die Regeln.
Duplikate ohne Groß- und Kleinschreibung entfernen
array_unique unterscheidet Groß- und Kleinschreibung: "PHP" und "php" sind verschieden. Um sie als Duplikate zu behandeln, aber die ursprüngliche Schreibweise des ersten zu behalten, ermittelst du die eindeutigen Schlüssel auf einer kleingeschriebenen Kopie und behältst diese Schlüssel aus dem Original.
array_map baut eine kleingeschriebene Kopie mit denselben Schlüsseln, array_unique behält die Schlüssel der ersten Vorkommen, und array_intersect_key holt diese Schlüssel aus dem ursprünglichen Array. Für Text mit Umlauten, Akzenten oder Japanisch verwendest du mb_strtolower statt strtolower.
array_unique bei einem mehrdimensionalen Array
Ohne Flag wandelt array_unique jede Zeile in den String "Array" um, sodass alle Zeilen gleich aussehen und nur die erste übrig bleibt, mit einer Warnung „Array to string conversion“ für jede Zeile. Übergib SORT_REGULAR, um ganze Zeilen zu vergleichen. Um eine Zeile pro Wert eines einzelnen Felds zu behalten, ist array_column mit null und einem Index-Schlüssel einfacher.
Der zweite Ansatz behält für jede E-Mail die letzte Zeile, weil jede spätere Zeile die frühere unter demselben Schlüssel überschreibt. Die Seite zu array_column erklärt den Index-Schlüssel im Detail.
Doppelte Werte finden und zählen
array_count_values() liefert, wie oft jeder Wert vorkommt. Filtere das nach Zählungen über eins, und du hast die Duplikate.
Die letzte Prüfung ist ein gängiger Einzeiler, um zu testen, ob ein Array überhaupt Duplikate hat.
Schnellere eindeutige Werte bei großen Arrays
array_unique wandelt jeden Wert vor dem Vergleich in einen String um, was bei Tausenden Werten in Ordnung ist. Bei einer großen Liste von Ganzzahlen oder Strings ist Umdrehen schneller: Werte werden zu Schlüsseln, und Schlüssel sind per Definition eindeutig.
Die Zeiten ändern sich von Durchlauf zu Durchlauf, aber die Version mit Umdrehen ist meist um ein Vielfaches schneller. Sie funktioniert nur mit Werten, die Array-Schlüssel sein können (Ganzzahlen und Strings), und numerische Strings wie "5" kommen als Ganzzahlen zurück.
Häufig gestellte Fragen
Behält array_unique die Schlüssel?
Ja. Es behält das erste Vorkommen jedes Werts unter seinem ursprünglichen Schlüssel und verwirft die späteren, also können die Schlüssel Lücken haben. Verwende array_values(array_unique($arr)), um sie ab 0 neu zu nummerieren.
Wie verwende ich array_unique bei einem mehrdimensionalen Array?
Übergib SORT_REGULAR, damit ganze Zeilen verglichen werden: array_unique($rows, SORT_REGULAR). Um eine Zeile pro Wert eines Felds zu behalten, etwa eine Zeile pro E-Mail, indizierst du die Zeilen nach diesem Feld: array_column($rows, null, 'email') behält für jede E-Mail die letzte Zeile.
Wie entferne ich Duplikate ohne Groß- und Kleinschreibung?
Ermittle die eindeutigen Schlüssel auf einer kleingeschriebenen Kopie und behalte diese Schlüssel aus dem Original: array_intersect_key($arr, array_unique(array_map('strtolower', $arr))). Verwende mb_strtolower für Text außerhalb von ASCII.
Wie finde ich heraus, welche Werte in einem PHP-Array doppelt sind?
Zähle sie mit array_count_values($arr) und behalte dann die Zählungen über eins: array_keys(array_filter(array_count_values($arr), fn($n) => $n > 1)). array_count_values funktioniert nur mit Strings und Ganzzahlen.