explode($separator, $string) разбивает строку в каждом месте, где встречается $separator, и возвращает части массивом. explode(',', 'apple,banana,cherry') даёт ['apple', 'banana', 'cherry'].
Разделителем может быть любая строка, а не только один символ: explode(' and ', 'tea and milk and sugar') работает так же. Обратная операция, склейка массива обратно в строку, это implode().
Синтаксис и возвращаемое значение
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
Функция всегда возвращает массив. Если разделитель не встречается, массив содержит всю строку единственным элементом. Это касается и пустой строки, которая даёт массив с одной пустой строкой внутри; отсюда частая ошибка "мой цикл выполняется один раз на пустом вводе".
Ограничение числа частей
Третий аргумент, $limit, меняет число получаемых частей:
- Положительный limit возвращает не больше указанного числа частей. Последняя часть содержит остаток строки вместе с разделителями.
- Отрицательный limit возвращает все части, кроме последних
abs($limit). - Limit
0считается равным1.
Положительный limit подходит, когда важен только первый разделитель, например в строке key=value, где значение тоже может содержать =: explode('=', 'query=a=b', 2) даёт ['query', 'a=b']. Следующие разделы используют его именно так.
Чтобы получить только последнюю часть, сначала сохраните массив в переменную: $parts = explode('/', $path); $file = end($parts);. Запись end(explode('/', $path)) всё равно вернёт правильное значение, но PHP напечатает Notice: Only variables should be passed by reference, потому что end() принимает аргумент по ссылке.
Разбиение строки по переносу строки
explode("\n", $text) разбивает по переносам строк. Используйте двойные кавычки: в одинарных '\n' это обратный слеш и буква n, а не перенос строки. Текст из файлов Windows или HTML-форм часто заканчивает строки на "\r\n", и тогда в конце каждой части остаётся лишний "\r". preg_split('/\R/', $text) разбивает по любому виду переноса строки.
Обрезка частей и удаление пустых
Пользовательский ввод вроде "red, green , ,blue" содержит пробелы вокруг элементов и пустой элемент посередине. Пропустите части через trim() с помощью array_map(), а потом удалите пустые строки через array_filter(). array_values() затем перенумеровывает ключи, потому что array_filter() сохраняет исходные.
Колбэк fn($c) => $c !== '' сохраняет строку "0". Простой array_filter($colors) её бы отбросил, потому что "0" ложно.
Строку в ассоциативный массив
Настройки, cookie и похожие на запрос строки часто хранятся парами key=value. Разбейте дважды: один раз на пары, второй раз каждую пару с limit 2, распаковав две части в переменные (деструктуризация массива).
Пара без =, например debug, даёт массив из одного элемента, и деструктуризация печатает Warning: Undefined array key 1. Чтобы этого избежать, дополните результат до двух элементов: [$key, $value] = explode('=', $pair, 2) + [1 => ''];.
Для настоящей строки запроса из URL это делает parse_str(), которая к тому же декодирует %20 и +.
Разбиение по нескольким разделителям
explode() принимает один разделитель. Чтобы разбивать по запятым, точкам с запятой или пробелам, используйте preg_split() с классом символов. PREG_SPLIT_NO_EMPTY отбрасывает пустые части, которые возникают, когда два разделителя идут подряд.
Японский и другой текст в UTF-8
explode() сравнивает байты, а в UTF-8 полный символ никогда не встречается внутри байтов другого символа, поэтому разбиение японского текста по японскому разделителю вроде 、 или полноширинной запятой работает правильно.
explode, str_split и preg_split
| Функция | Разбивает по | Пример | Результат |
|---|---|---|---|
explode() | фиксированной строке-разделителю | explode('-', '2026-03-14') | ['2026', '03', '14'] |
str_split() | каждым N байтам | str_split('abcdef', 2) | ['ab', 'cd', 'ef'] |
mb_str_split() | каждым N символам | mb_str_split('日本語') | ['日', '本', '語'] |
preg_split() | регулярному выражению | preg_split('/\s+/', 'a b') | ['a', 'b'] |
explode() не работает с регулярными выражениями, поэтому быстрее preg_split(), и именно её стоит брать, когда разделитель это фиксированная строка.
Частая ошибка: пустой разделитель
Пустой разделитель это ошибка. Начиная с PHP 8.0 explode('', 'abc') выбрасывает ValueError, а не возвращает false, и скрипт останавливается:
PHP Fatal error: Uncaught ValueError: explode(): Argument #1 ($separator) cannot be empty in /home/index.php:3
Чтобы разбить строку на символы, используйте str_split('abc') для ASCII-текста или mb_str_split($s) для всего, где могут быть многобайтовые символы.
Часто задаваемые вопросы
Что делает explode() в PHP?
Разбивает строку в каждом месте, где встречается разделитель, и возвращает части массивом: explode(',', 'a,b,c') возвращает ['a', 'b', 'c']. Сам разделитель ни в одну часть не попадает.
Что возвращает explode(), если разделитель не найден?
Массив из одного элемента, всей строки: explode(',', 'apple') возвращает ['apple']. Пустая строка даёт [''], массив с одной пустой строкой, поэтому count() возвращает 1, а не 0.
Как разбить строку по нескольким разделителям в PHP?
Используйте preg_split() с классом символов: preg_split('/[,;|]/', $s) разбивает по запятым, точкам с запятой и вертикальным чертам. Чтобы заодно отбросить пустые части, передайте limit -1 и флаг: preg_split('/[,;|]/', $s, -1, PREG_SPLIT_NO_EMPTY).
Чем explode() отличается от str_split()?
explode() разбивает по выбранному вами разделителю. str_split($s, 3) режет строку на куски фиксированной длины, считая в байтах. Для японского или другого многобайтового текста используйте mb_str_split($s), она считает символы.
Почему explode() выбрасывает ValueError?
Потому что разделитель пустая строка. Начиная с PHP 8.0 explode('', $s) выбрасывает ValueError: explode(): Argument #1 ($separator) cannot be empty. Чтобы разбить строку на отдельные символы, используйте str_split() или mb_str_split().