array_unique($array) zwraca tablicę bez powtórzonych wartości. Pierwsze wystąpienie każdej wartości zostaje, pod swoim oryginalnym kluczem, a późniejsze kopie są odrzucane.
Pierwszy wynik zachowuje klucze 0, 1, 3: pozycje, na których każda wartość pojawiła się po raz pierwszy. Otocz wywołanie przez array_values(), gdy chcesz czystej listy, na przykład przed json_encode.
Jak array_unique decyduje, że dwie wartości są takie same
Domyślnie każda wartość jest zamieniana na string i porównywane są stringi. Dlatego 1, "1" i 1.0 liczą się jako ta sama wartość, a wygrywa pierwsza. Drugi argument zmienia sposób porównania.
| Flaga | Dwie wartości są duplikatami, gdy |
|---|---|
SORT_STRING (domyślnie) | (string) $a === (string) $b |
SORT_REGULAR | $a == $b |
SORT_NUMERIC | są równe jako liczby |
Przy domyślnej fladze "01" przetrwa, bo string "01" to nie string "1". Przy SORT_REGULAR zostaje odrzucone, bo "01" == 1 jest prawdą. Luźne porównanie pozwala też, by wartość logiczna true pasowała do każdej niepustej wartości. Przy mieszanych typach sprawdź wynik, zanim na nim polegasz; zasady wyjaśnia strona o operatorach porównania.
Usuwanie duplikatów bez rozróżniania wielkości liter
array_unique rozróżnia wielkość liter: "PHP" i "php" są różne. Aby traktować je jako duplikaty, ale zachować oryginalny zapis pierwszego, znajdź unikalne klucze na kopii małymi literami i zostaw te klucze z oryginału.
array_map buduje kopię małymi literami z tymi samymi kluczami, array_unique zostawia klucze pierwszych wystąpień, a array_intersect_key wybiera te klucze z oryginalnej tablicy. Dla tekstu z polskimi znakami, akcentami czy japońskiego użyj mb_strtolower zamiast strtolower.
array_unique na tablicy wielowymiarowej
Bez flagi array_unique zamienia każdy wiersz na string "Array", więc wszystkie wiersze wyglądają identycznie i zostaje tylko pierwszy, z ostrzeżeniem „Array to string conversion” dla każdego wiersza. Przekaż SORT_REGULAR, aby porównywać całe wiersze. Aby zostawić jeden wiersz na wartość jednego pola, prostsze jest array_column z null i kluczem indeksu.
Drugie podejście zostawia ostatni wiersz dla każdego e-maila, bo każdy późniejszy wiersz nadpisuje wcześniejszy pod tym samym kluczem. Klucz indeksu szczegółowo wyjaśnia strona array_column.
Znajdowanie i liczenie powtórzonych wartości
array_count_values() zwraca, ile razy pojawia się każda wartość. Przefiltruj to po licznikach większych od jednego, a dostaniesz duplikaty.
Ostatnie sprawdzenie to popularny jednolinijkowiec, który sprawdza, czy tablica w ogóle ma duplikaty.
Szybsze unikalne wartości dla dużych tablic
array_unique przed porównaniem zamienia każdą wartość na string, co przy tysiącach wartości jest w porządku. Dla dużej listy liczb całkowitych lub stringów szybsze jest odwrócenie tablicy: wartości stają się kluczami, a klucze są z definicji unikalne.
Czasy zmieniają się między uruchomieniami, ale wersja z odwróceniem jest zwykle kilka razy szybsza. Działa tylko dla wartości, które mogą być kluczami tablicy (liczby całkowite i stringi), a stringi liczbowe, takie jak "5", wracają jako liczby całkowite.
Najczęściej zadawane pytania
Czy array_unique zachowuje klucze?
Tak. Zostawia pierwsze wystąpienie każdej wartości pod jej oryginalnym kluczem i odrzuca późniejsze, więc w kluczach mogą być luki. Użyj array_values(array_unique($arr)), aby ponumerować je od 0.
Jak użyć array_unique na tablicy wielowymiarowej?
Przekaż SORT_REGULAR, aby porównywane były całe wiersze: array_unique($rows, SORT_REGULAR). Aby zostawić jeden wiersz na wartość pola, na przykład jeden wiersz na e-mail, zaindeksuj wiersze tym polem: array_column($rows, null, 'email') zostawia ostatni wiersz dla każdego e-maila.
Jak usunąć duplikaty bez rozróżniania wielkości liter?
Znajdź unikalne klucze na kopii małymi literami i zostaw te klucze z oryginału: array_intersect_key($arr, array_unique(array_map('strtolower', $arr))). Dla tekstu spoza ASCII użyj mb_strtolower.
Jak znaleźć powtórzone wartości w tablicy PHP?
Policz je przez array_count_values($arr), a potem zostaw liczniki większe od jednego: array_keys(array_filter(array_count_values($arr), fn($n) => $n > 1)). array_count_values działa tylko na stringach i liczbach całkowitych.