1. Grundlegende Anwendung von array_unique()
Zum Entfernen von mehrfach vorkommenden Werten aus einem Array (sodass jeder Wert nur noch ein Mal vorkommt, vergleichbar mit DISTINCT bei SQL) stellt PHP die Funktion array_unique($array) zur Verfügung.
PHP-Code
1 2 3 4 5 6 7 | <?php $arr = array (1, 2, 4, 1, 6, 2, 9, 9, 10); $arr = array_unique ( $arr ); foreach ( $arr as $val ) { echo ( "$val, " ); } ?> |
Ausgabe
1, 2, 4, 6, 9, 10,
Zu beachten ist, dass array_unique() jeden Wert standardmäßig in einen String umwandelt, sodass z.B. (int)1 und (string)"1" als der selbe Wert betrachtet werden.
PHP-Code
1 2 3 4 5 6 7 | <?php $arr = array (1, 4, 8, 'hallo' , '1' , 8, 'vier' , '4' ); $arr = array_unique ( $arr ); foreach ( $arr as $val ) { echo ( "$val, " ); } ?> |
Ausgabe
1, 4, 8, hallo, vier,
array_unique() erhält die Schlüssel so weit wie möglich bei.
PHP-Code
1 2 3 4 5 6 7 | <?php $arr = array ( 'eins' =>1, 'zwei' =>2, 'noch_eine_eins' =>1); $arr = array_unique ( $arr ); foreach ( $arr as $key => $val ) { echo ( "$key=>$val, " ); } ?> |
Ausgabe
eins=>1, zwei=>2,
Sofern das Array nur numerische Werte enthält, kann dieser Umstand der Funktion signalisiert werden, wodurch die Performance verbessert wird.
PHP-Code
1 2 3 4 5 6 7 | <?php $arr = array (15, 19, 7, 15, 100, 101, 15, 19); $arr = array_unique ( $arr , SORT_NUMERIC); foreach ( $arr as $val ) { echo ( "$val, " ); } ?> |
Ausgabe
15, 19, 7, 100, 101,
2. array_unique() bei verschiedener Groß- und Kleinschreibung
Enthält das Array Strings, dann agiert array_unique() standardmäßig case-sensitive.
"hallo" und "Hallo" würden daher zum Beispiel als unterschiedliche Werte angesehen.
Die nachfolgende Funktion verhält sich wie array_unique(), unterscheidet aber nicht zwischen Groß- und Kleinschreibung.
Werden mehrere Werte mit unterschiedlicher Groß- und Kleinschreibung gefunden, dann wird nur der erste dieser Werte übernommen.
PHP-Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php function array_unique_ci( $arr ) { $out = array (); $found = array (); foreach ( $arr as $key => $val ) { $l = mb_strtolower( strval ( $val )); if (!isset( $found [ $l ])) { $out [ $key ] = $val ; } $found [ $l ] = true; } return $out ; } $arr = array ( 'eins' , 'ZwEi' , 'DREI' , 'drei' , 'einS' , 'zwei' , 1, 3.141); $arr = array_unique_ci( $arr ); foreach ( $arr as $val ) { echo ( "$val, " ); } ?> |
Ausgabe
eins, ZwEi, DREI, 1, 3.141,
3. Ermitteln, welche Werte Duplikate sind
Soll bestimmt werden, welche Werte mehrfach vorkommen, kann array_unique() in Kombination mit array_diff_assoc() verwendet werden.
array_unique() entfernt die Duplikate und array_diff_assoc() ermittelt, welche Schlüssel-Wert-Paare im Array ohne Duplikate nicht mehr enthalten sind.
(Auf das Ergebnis von array_diff_assoc() könnte wiederum array_unique() angewandt werden, da andernfalls mehrfach entfernte Duplikate auch mehrmals aufgezählt werden.)
PHP-Code
1 2 3 4 5 | <?php $arr = array (1, 2, 4, 1, 6, 2, 9, 9, 10, 9); $unique = array_unique ( $arr ); var_dump( array_diff_assoc ( $arr , $unique )); ?> |
Ausgabe
array(4) { [3]=> int(1) [5]=> int(2) [7]=> int(9) [9]=> int(9) }
4. array_unique() für mehrdimensionale Arrays
Duplikate aus mehrdimensionalem Array entfernen
Die nachfolgende rekursive Funktion entfernt alle Duplikate aus einem mehrdimensionalem Array.
Dabei wird jedes Unterarray für sich behandelt. Enthält demnach Unterarray A eine 1 und auch Unterarray B eine 1, dann taucht die 1 auch nach Anwendung der Funktion in A und B noch immer auf, aber jeweils nur maximal ein Mal.
Die Funktion erhält die Schlüssel so weit wie möglich.
Die Funktion ist nur auf Arrays ausgelegt, die Unterarrays und/oder skalare Werte (string, int, float, boolean) enthalten.
PHP-Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php function array_unique_recursive( $array ) { $set = array (); $out = array (); foreach ( $array as $key => $val ) { if ( is_array ( $val )) { $out [ $key ] = array_unique_recursive( $val ); } elseif (!isset( $set [ $val ])) { $out [ $key ] = $val ; $set [ $val ] = true; } } return $out ; } $arr = array (1, 2, 4, 1, 1, 2, 9, array (1, 5, 3, 1, 3, 5, 5), 9, 10, 9); $arr = array_unique_recursive( $arr ); var_dump( $arr ); ?> |
Ausgabe
array(6) { [0]=> int(1) [1]=> int(2) [2]=> int(4) [6]=> int(9) [7]=> array(3) { [0]=> int(1) [1]=> int(5) [2]=> int(3) } [9]=> int(10) }
Die nachfolgende rekursive Funktion verhält sich genauso wie die zuvor genannte, löscht aber zusätzlich Duplikate, die über mehrere Arrays verteilt sind.
Enthält demnach Unterarray A eine 1 und B eine 1, dann ist die 1 nachher nur noch in A enthalten und B ein leeres Array.
PHP-Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php function array_unique_recursive_all( $array , $found =null) { if ( $found ===null) { $found = array (); } $out = array (); foreach ( $array as $key => $val ) { if ( is_array ( $val )) { $tmp = array_unique_recursive_all( $val , $found ); $out [ $key ] = $tmp [0]; $found = $tmp [1]; } elseif (!isset( $found [ $val ])) { $out [ $key ] = $val ; $found [ $val ] = true; } } return array ( $out , $found ); } $arr = array (1, 2, 4, 1, 6, 2, 9, array (1, 5, 10, 1, 3, 5, 5), 9, 10, array (9, 17), array (1), 9); list( $arr ) = array_unique_recursive_all( $arr ); var_dump( $arr ); ?> |
Ausgabe
array(8) { [0]=> int(1) [1]=> int(2) [2]=> int(4) [4]=> int(6) [6]=> int(9) [7]=> array(3) { [1]=> int(5) [2]=> int(10) [4]=> int(3) } [10]=> array(1) { [1]=> int(17) } [11]=> array(0) { } }
5. Eigenes array_unqiue()
Um Duplikate zu entfernen, ohne dabei array_unique() zu verwenden, kann eine Kombination aus array_keys() und array_flip() verwendet werden. array_flip() vertauscht Werte und Schlüssel miteinander, sodass etwa aus array('eins'=>1) das Array array(1=>'eins') wird.
Da jeder Schlüssel nur ein Mal definiert sein darf, werden mehrfache Schlüssel automatisch überschrieben.
Die Schlüssel wiederum können mit array_keys() ausgelesen werden.
PHP-Code
1 2 3 4 5 6 | <?php $arr = array (1, 2, 4, 1, 6, 2, 9, 9, 10); $flipped = array_flip ( $arr ); $unique = array_keys ( $flipped ); var_dump( $unique ); ?> |
Ausgabe
array(6) { [0]=> int(1) [1]=> int(2) [2]=> int(4) [3]=> int(6) [4]=> int(9) [5]=> int(10) }
Alternativ ist auch die Anwendung einer foreach-Schleife mit passender if/else-Abfrage möglich:
PHP-Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php function my_array_unique( $arr ) { $found = array (); foreach ( $arr as $key => $val ) { // Abfrage, ob Wert $val bereits mindestens ein Mal gefunden wurde if (isset( $found [ $val ])) { // falls ja wird der Wert aus dem Array entfernt unset( $arr [ $key ]); } $found [ $val ] = true; } return $arr ; } $arr = array (1, 2, 4, 1, 6, 2, 9, 9, 10); $arr = my_array_unique( $arr ); var_dump( $arr ); ?> |
Ausgabe
array(6) { [0]=> int(1) [1]=> int(2) [2]=> int(4) [4]=> int(6) [6]=> int(9) [8]=> int(10) }
Beide zuvor genannten Funktionen eignen sich nur für die Anwendung auf eindimensionale Arrays mit skalaren Werten (Boolean, Integer, String, Float).