Menu

array_unique() w PHP: usuwanie duplikatów z tablicy

array_unique($array) usuwa powtórzone wartości i zostawia pierwsze wystąpienie każdej z nich, z jej oryginalnym kluczem. Dowiedz się, jak ponumerować wynik od nowa, usuwać duplikaty bez rozróżniania wielkości liter, usuwać duplikaty z tablicy wielowymiarowej oraz liczyć i znajdować powtórzenia.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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.

FlagaDwie wartości są duplikatami, gdy
SORT_STRING (domyślnie)(string) $a === (string) $b
SORT_REGULAR$a == $b
SORT_NUMERICsą 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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ