Jak mogę usunąć zduplikowane wartości z wielowymiarowej tablicy w PHP?
Przykładowa tablica:
Array
(
[0] => Array
(
[0] => abc
[1] => def
)
[1] => Array
(
[0] => ghi
[1] => jkl
)
[2] => Array
(
[0] => mno
[1] => pql
)
[3] => Array
(
[0] => abc
[1] => def
)
[4] => Array
(
[0] => ghi
[1] => jkl
)
[5] => Array
(
[0] => mno
[1] => pql
)
)
serialize(array('a' => '1', 'b' => '1'))
różni się odserialize(array('b' => '1', 'a' => '1'))
. Ta opcja nie powiedzie się w przypadku tablic używanych jakosets
lub(hash)maps
.Od wersji 5.2.9 możesz używać,
array_unique()
jeśli używaszSORT_REGULAR
flagi w taki sposób:To sprawia, że funkcja porównuje elementy pod kątem równości, jakby
$a == $b
były używane, co jest idealne dla twojego przypadku.Wynik
Należy jednak pamiętać, że dokumentacja stanowi:
źródło
Miałem podobny problem, ale znalazłem dla niego 100% działające rozwiązanie.
źródło
Inny sposób. Zachowa również klucze.
źródło
Komentarze użytkowników do dokumentacji array_unique () mają na to wiele rozwiązań. Oto jeden z nich:
Pochodzi z http://ca3.php.net/manual/en/function.array-unique.php#57202 .
źródło
Jeśli „usuń duplikaty” oznacza „usuń duplikaty, ale pozwól na to”, rozwiązaniem może być
array_unique(...)
najpierw zastosowanie „kolumny identyfikatora”, a następnie usunięcie w oryginalnej tablicy wszystkich kluczy, które zostały usunięte z tablicy kolumn :Wynik to:
źródło
Spowoduje to usunięcie zduplikowanych nazw z tablicy. unikatowy według klucza
źródło
$array
klucze zaczynają się od „0”. Możliwe,$array
że klucze zaczynają się na inny numer, jeśli$array
jest wynikiem wcześniejszej manipulacji tablicą. Użyj,array_values
aby zresetować klawisze z powrotem do „0”Proste rozwiązanie:
źródło
Wystarczy użyć opcji SORT_REGULAR jako drugiego parametru.
źródło
jeśli chcesz wyeliminować duplikaty określonych kluczy, takich jak identyfikator mysqli, oto prosta funkcja
Punkty bonusowe Możesz przekazać tablicę kluczy i dodać zewnętrzny foreach, ale będzie 2x wolniejszy na każdy dodatkowy klucz.
źródło
Bardzo łatwy i logiczny sposób na unikatową tablicę wielowymiarową jest następujący,
Jeśli masz taką tablicę:
użyj,
foreach
aby rozwiązać ten problem:da ci następujący wynik:
a jeśli chcesz zmienić kolejność klawiszy,
Ta operacja da ci uporządkowane kluczowe wartości:
Mam nadzieję, że to wszystko wyczyści.
źródło
jeśli masz taką tablicę:
(users to nazwa tablicy)
i chcesz usunąć duplikaty ... to:
może być rozwiązaniem: P
źródło
Łatwe do odczytania rozwiązanie, prawdopodobnie nie najbardziej wydajne:
źródło
Jak mówią ludzie,
array_unique()
jest bardzo powolny, oto fragment, którego używam dla wielowymiarowej tablicy na jednym poziomie.Odwołaj się do pierwszego komentarza od
array_unique()
strony funkcji w php.netźródło
$output = array_map('unserialize', array_keys($result));
Wiele osób pytało mnie, jak zrobić tablicę wielowymiarową Unique. Wziąłem odniesienie z twojego komentarza i to mi pomaga.
Przede wszystkim dzięki @jeromegamez @daveilers za twoje rozwiązanie. Ale za każdym razem, gdy udzielałem odpowiedzi, pytali mnie, jak działa ta funkcja „serializacji” i „nieserializacji”. Dlatego chcę podzielić się z tobą tym powodem, aby pomóc większej liczbie osób zrozumieć koncepcję tego.
Wyjaśniam, dlaczego używamy „serializacji” i „odserializowania” etapami:
Krok 1: Przekształć tablicę wielowymiarową w tablicę jednowymiarową
Aby przekonwertować tablicę wielowymiarową na tablicę jednowymiarową, najpierw wygeneruj bajtową reprezentację strumienia wszystkich elementów (w tym tablic zagnieżdżonych) wewnątrz tablicy. Funkcja serialize () może generować bajtową reprezentację strumienia wartości. Aby wygenerować bajtową reprezentację strumienia wszystkich elementów, wywołaj funkcję serialize () wewnątrz funkcji array_map () jako funkcję zwrotną. Wynikiem będzie macierz jednowymiarowa, bez względu na liczbę poziomów macierzy wielowymiarowej.
Krok 2: Spraw, by wartości były unikalne
Aby ta tablica jednowymiarowa była unikalna, użyj funkcji array_unique ().
Krok 3: Przywróć go do tablicy wielowymiarowej
Chociaż tablica jest teraz unikalna, wartości wyglądają jak reprezentacja strumienia bajtów. Aby przywrócić go z powrotem do tablicy wielowymiarowej, użyj funkcji unserialize ().
Jeszcze raz dziękuję za to wszystko.
źródło
Alternatywa dla serializacji i wyjątkowa
* /
źródło
Jeśli masz taką tablicę
i chcesz uzyskać takie tablice:
lub
poniższy kod może pomóc
źródło
Zastanowiłem się nad tym problemem i zdecydowałem, że optymalne rozwiązanie powinno przestrzegać dwóch zasad.
Mając to na uwadze i biorąc pod uwagę wszystkie dziwactwa PHP, poniżej znajduje się rozwiązanie, które wymyśliłem. W przeciwieństwie do niektórych innych odpowiedzi ma możliwość usuwania elementów na podstawie dowolnych kluczy. Oczekuje się, że tablicą wejściową będą klawisze numeryczne.
Jedyną wadą jest to, że klucze nie są w porządku po zakończeniu iteracji. Nie stanowi to problemu, jeśli następnie używasz tylko pętli foreach, ale jeśli potrzebujesz użyć pętli for, możesz umieścić
$input = array_values($input);
po powyższym, aby zmienić numerację kluczy.źródło
Na podstawie odpowiedzi oznaczonej jako poprawna, dodając moją odpowiedź. Dodano mały kod, aby zresetować indeksy
źródło