Menu

array_merge() w PHP: łączenie dwóch lub więcej tablic

array_merge($a, $b) łączy tablice w jedną: wartości z kluczami liczbowymi są dopisywane i numerowane od nowa, a przy kluczach tekstowych wygrywa późniejsza tablica. Dowiedz się, czym array_merge różni się od operatora + i składni [...$a, ...$b], jak połączyć listę tablic i kiedy lepiej pasuje array_merge_recursive lub array_replace.

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

array_merge($a, $b) zwraca nową tablicę z elementami $a, po których następują elementy $b. Klucze liczbowe są numerowane od nowa od 0; gdy obie tablice mają ten sam klucz tekstowy, wygrywa wartość z późniejszej tablicy. Możesz podać dowolnie wiele tablic.

array_merge() nie zmienia swoich argumentów. Zwraca połączoną tablicę, więc przypisz wynik: $all = array_merge($all, $more);.

Klucze liczbowe są numerowane od nowa

array_merge() traktuje klucze całkowite jak pozycje, a nie nazwy. Każdy element z kluczem całkowitym jest dopisywany i dostaje nowy klucz od 0, nawet jeśli tablice używały tych samych liczb lub miały luki. Tego chcesz przy listach, ale to niespodzianka, gdy liczby są identyfikatorami.

Klucze tekstowe wyglądające jak liczby całkowite ('101') są zapisywane jako liczby całkowite, więc również są numerowane od nowa. Klucze takie jak 'id101' pozostają bez zmian.

array_merge vs operator +

Operator + (suma tablic) także łączy tablice, ale z odwrotną zasadą: dla każdego klucza, który już istnieje w lewej tablicy, wygrywa lewa wartość, a prawa jest odrzucana. Nigdy nie numeruje od nowa. Dlatego + naturalnie nadaje się do uzupełniania wartości domyślnych, a array_merge() do ich nadpisywania.

array_merge($a, $b)$a + $b
Ten sam klucz tekstowywartość z $bwartość z $a
Klucze całkowitenumerowane od nowa, wszystkie wartości zachowanezachowane, $b przegrywa przy kolizji
Typowe użyciełączenie list, nadpisywanie ustawieńuzupełnianie domyślnych, zachowanie ID

Ostatni przykład w bloku to klasyczna pułapka +: ['a', 'b'] + ['x', 'y', 'z'] daje a, b, z, bo klucze 0 i 1 już istnieją po lewej.

Składnia rozpakowania: [...a,...a, ...b]

Operator rozpakowania rozwija tablice wewnątrz literału tablicy. Działa jak array_merge(): klucze całkowite są numerowane od nowa, a od PHP 8.1 dozwolone są klucze tekstowe i wygrywa późniejszy. Czyta się go dobrze, gdy mieszasz tablice z pojedynczymi wartościami.

Aby dopisać tablicę do istniejącej w miejscu, zobacz array_push() z operatorem rozpakowania.

Łączenie tablicy tablic

Gdy tablice do połączenia same są na liście, rozpakuj tę listę w array_merge(). To także szybki sposób łączenia w pętli: zbierz kawałki, a potem połącz raz.

Zapis $all = array_merge($all, $batch); w pętli działa, ale przy każdym przebiegu kopiuje całą rosnącą tablicę, co przy tysiącach elementów staje się wolne.

array_merge_recursive i array_replace

array_merge_recursive() łączy też zagnieżdżone tablice, ale dla powtórzonego klucza tekstowego ze zwykłą wartością nie nadpisuje: zbiera obie wartości w nową tablicę. Przy konfiguracji rzadko tego chcesz. Tam zwykle właściwym narzędziem jest array_replace_recursive(): nadpisuje wartości na każdym poziomie i zachowuje klucze.

Przeczytaj trzy linie JSON od góry: array_merge() zastąpiło całą tablicę db i zgubiło host, array_merge_recursive() zamieniło port i debug w dwuelementowe listy, a array_replace_recursive() dało konfigurację, o którą chodziło.

Częsty błąd: łączenie niczego nie usuwa

array_merge() zachowuje powtórzone wartości, które leżą pod różnymi kluczami. Połączenie dwóch list tagów daje każdy wspólny tag dwa razy. Przepuść wynik przez array_unique(), a potem array_values(), aby ponumerować go od nowa.

Strona o array_unique opisuje usuwanie duplikatów z wierszy i zagnieżdżonych tablic.

Najczęściej zadawane pytania

Czym różni się array_merge od + w PHP?

Przy powtórzonych kluczach tekstowych array_merge($a, $b) zachowuje wartość z $b, a $a + $b zachowuje wartość z $a. Przy kluczach liczbowych array_merge() dopisuje wszystko i numeruje od nowa, a + zachowuje klucze liczbowe i odrzuca każdy element $b, którego klucz już istnieje w $a.

Jak połączyć tablice i zachować klucze liczbowe?

Użyj $a + $b, jeśli ma wygrać lewa tablica, albo array_replace($a, $b), jeśli ma wygrać prawa. array_merge() zawsze numeruje klucze liczbowe od nowa od 0.

Jak połączyć tablicę tablic w PHP?

Rozpakuj zewnętrzną tablicę w array_merge(): $all = array_merge(...$lists);. Dla pustej listy zwraca []. Najpierw zbierz tablice w pętli i połącz je raz na końcu; wywoływanie array_merge() w pętli za każdym razem kopiuje rosnący wynik.

Czy operatora rozpakowania można używać z kluczami tekstowymi w PHP?

Tak, od PHP 8.1. [...$a, ...$b] działa wtedy jak array_merge($a, $b): klucze liczbowe są numerowane od nowa, a późniejszy klucz tekstowy nadpisuje wcześniejszy.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ