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
0jest traktowany jak1.
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
| Funkcja | Dzieli przy | Przykład | Wynik |
|---|---|---|---|
explode() | stałym stringu separatora | explode('-', '2026-03-14') | ['2026', '03', '14'] |
str_split() | co N bajtów | str_split('abcdef', 2) | ['ab', 'cd', 'ef'] |
mb_str_split() | co N znaków | mb_str_split('日本語') | ['日', '本', '語'] |
preg_split() | wyrażeniu regularnym | preg_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().