Menu

explode() w PHP: podział stringa na tablicę

explode(',', $string) dzieli string przy każdym przecinku i zwraca kawałki jako tablicę. Poznaj parametr limit, podział po znaku nowej linii, przycinanie kawałków i sytuacje, w których lepszym narzędziem jest str_split lub preg_split.

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

explode($separator, $string) dzieli string przy każdym wystąpieniu $separator i zwraca kawałki jako tablicę. explode(',', 'apple,banana,cherry') daje ['apple', 'banana', 'cherry'].

Separatorem może być dowolny string, nie tylko jeden znak: explode(' and ', 'tea and milk and sugar') działa tak samo. Odwrotną operacją, czyli łączeniem tablicy z powrotem w string, jest implode().

Składnia i wartość zwracana

explode(string $separator, string $string, int $limit = PHP_INT_MAX): array

Zawsze zwraca tablicę. Jeśli separatora nie ma, tablica zawiera cały string jako jedyny element. Dotyczy to też pustego stringa, który daje tablicę z jednym pustym stringiem, co jest częstym źródłem błędów typu „moja pętla wykonuje się raz przy pustych danych”.

Ograniczenie liczby kawałków

Trzeci argument, $limit, zmienia liczbę otrzymanych kawałków:

  • Dodatni limit zwraca najwyżej tyle kawałków. Ostatni kawałek zawiera resztę stringa, razem z separatorami.
  • Ujemny limit zwraca wszystkie kawałki oprócz ostatnich abs($limit).
  • Limit 0 jest traktowany jak 1.

Dodatni limit to właściwe narzędzie, gdy liczy się tylko pierwszy separator, na przykład w linii key=value, w której wartość też może zawierać =: explode('=', 'query=a=b', 2) daje ['query', 'a=b']. Kolejne sekcje używają go właśnie tak.

Aby dostać tylko ostatni kawałek, najpierw zapisz tablicę w zmiennej: $parts = explode('/', $path); $file = end($parts);. Zapis end(explode('/', $path)) nadal zwraca właściwą wartość, ale PHP wypisuje Notice: Only variables should be passed by reference, bo end() przyjmuje argument przez referencję.

Podział stringa po znaku nowej linii

explode("\n", $text) dzieli przy znakach końca linii. Używaj podwójnych cudzysłowów: w pojedynczych '\n' to ukośnik wsteczny i litera n, a nie nowa linia. Tekst z plików Windows lub formularzy HTML często kończy linie przez "\r\n", co zostawia na końcu każdego kawałka zbędne "\r". preg_split('/\R/', $text) dzieli przy każdym rodzaju końca linii.

Przycinanie kawałków i odrzucanie pustych

Dane od użytkownika, takie jak "red, green , ,blue", mają spacje wokół elementów i pusty element w środku. Przepuść kawałki przez trim() za pomocą array_map(), a potem usuń puste stringi przez array_filter(). array_values() numeruje potem klucze od nowa, bo array_filter() zachowuje oryginalne.

Callback fn($c) => $c !== '' zachowuje string "0". Samo array_filter($colors) by go odrzuciło, bo "0" jest traktowane jak fałsz.

Zamiana stringa w tablicę asocjacyjną

Ustawienia, ciasteczka i stringi w stylu zapytań często są zapisywane jako pary key=value. Wywołaj explode dwa razy: raz dla par, raz dla każdej pary z limitem 2, rozpakowując dwa kawałki do zmiennych (destrukturyzacja tablic).

Para bez =, taka jak debug, daje tablicę z jednym elementem, a destrukturyzacja wypisuje Warning: Undefined array key 1. Uzupełnij wynik do dwóch elementów, aby tego uniknąć: [$key, $value] = explode('=', $pair, 2) + [1 => ''];.

Dla prawdziwego query stringa z adresu URL parse_str() robi to za ciebie i dodatkowo dekoduje %20 i +.

Podział według kilku separatorów

explode() przyjmuje jeden separator. Aby dzielić przy przecinkach, średnikach lub spacjach, użyj preg_split() z klasą znaków. PREG_SPLIT_NO_EMPTY odrzuca puste kawałki, które powstałyby z dwóch separatorów pod rząd.

Japoński i inny tekst UTF-8

explode() porównuje bajty, a w UTF-8 pełny znak nigdy nie pojawia się wewnątrz bajtów innego znaku, więc dzielenie japońskiego tekstu przy japońskim separatorze, takim jak 、 czy przecinek pełnej szerokości, działa poprawnie.

explode vs str_split vs preg_split

FunkcjaDzieli przyPrzykładWynik
explode()stałym stringu separatoraexplode('-', '2026-03-14')['2026', '03', '14']
str_split()co N bajtówstr_split('abcdef', 2)['ab', 'cd', 'ef']
mb_str_split()co N znakówmb_str_split('日本語')['日', '本', '語']
preg_split()wyrażeniu regularnympreg_split('/\s+/', 'a b')['a', 'b']

explode() nie wykonuje żadnej pracy z wyrażeniami regularnymi, więc jest szybsze od preg_split() i to po nie sięgaj zawsze, gdy separator jest stałym stringiem.

Częsty błąd: pusty separator

Pusty separator to błąd. Od PHP 8.0 explode('', 'abc') rzuca ValueError zamiast zwracać false, a skrypt się zatrzymuje:

PHP Fatal error:  Uncaught ValueError: explode(): Argument #1 ($separator) cannot be empty in /home/index.php:3

Aby podzielić string na znaki, użyj str_split('abc') dla tekstu ASCII albo mb_str_split($s) dla wszystkiego, co może zawierać znaki wielobajtowe.

Najczęściej zadawane pytania

Co robi explode() w PHP?

Dzieli string przy każdym wystąpieniu separatora i zwraca kawałki jako tablicę: explode(',', 'a,b,c') zwraca ['a', 'b', 'c']. Sam separator nie trafia do żadnego kawałka.

Co zwraca explode(), gdy separatora nie ma?

Tablicę z jednym elementem, całym stringiem: explode(',', 'apple') zwraca ['apple']. Pusty string daje [''], tablicę z jednym pustym stringiem, więc count() zwraca 1, a nie 0.

Jak podzielić string według kilku separatorów w PHP?

Użyj preg_split() z klasą znaków: preg_split('/[,;|]/', $s) dzieli przy przecinkach, średnikach i kreskach pionowych. Aby też odrzucić puste kawałki, podaj limit -1 i flagę: preg_split('/[,;|]/', $s, -1, PREG_SPLIT_NO_EMPTY).

Czym różni się explode() od str_split()?

explode() dzieli przy wybranym przez ciebie separatorze. str_split($s, 3) tnie string na kawałki stałej długości liczonej w bajtach. Dla tekstu z polskimi znakami, japońskiego lub innego wielobajtowego użyj mb_str_split($s), które liczy znaki.

Dlaczego explode() rzuca ValueError?

Bo separator jest pustym stringiem. Od PHP 8.0 explode('', $s) rzuca ValueError: explode(): Argument #1 ($separator) cannot be empty. Aby podzielić string na pojedyncze znaki, użyj str_split() albo mb_str_split().

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ