Превращение строки в массив: сравнение функций explode, preg_split, str_split
При работе с данными в PHP часто требуется преобразовать строку в массив. Основной инструмент для этого - функция explode(), но существуют и другие способы, подходящие для разных сценариев. Ниже разобраны ключевые варианты, их цели и возможные сложности.
Разбиение строки на массив: основные и альтернативные подходы
Как разделить строку по фиксированному разделителю и получить массив?
Самый быстрый и распространённый вариант - explode(). Функция принимает разделитель и строку, возвращает массив фрагментов.
$str = 'apple,banana,orange';
$arr = explode(',', $str);
print_r($arr);Php строка в массив по разделителю (разбиение строки на массив по разделителю php)
Array
(
[0] => apple
[1] => banana
[2] => orange
)Цель: быстрое разбиение простых списков, CSV без кавычек, данных с одинаковым разделителем. Случаи использования: парсинг URL-параметров, обработка логов, чтение конфигов.
Как разбить строку по регулярному выражению, если разделитель непостоянный?
Функция preg_split() использует регулярное выражение для разделения. Подходит для сложных разделителей (несколько символов, пробелы разной длины).
$text = "один два;три|четыре";
$parts = preg_split('/[;|\s]+/', $text);
print_r($parts);Array
(
[0] => один
[1] => два
[2] => три
[3] => четыре
)Типичная ошибка: забыть экранировать специальные символы в регулярном выражении. Например, точка без обратного слеша будет означать «любой символ». Для разделителя-точки пишут /\./. Также при работе с многобайтовыми кодировками может потребоваться модификатор u.
Как разбить строку на отдельные символы?
Если нужно получить массив из каждого символа строки, применяют str_split(). По умолчанию делит на символы (один байт), для многобайтовых строк используют mb_str_split() (PHP 7.4+).
$word = 'Привет';
$chars = mb_str_split($word);
print_r($chars);Array
(
[0] => П
[1] => р
[2] => и
[3] => в
[4] => е
[5] => т
)Случаи использования: обработка строк посимвольно, шифрование, валидация длины.
Как разбить строку на части заданной длины без разделителя?
Функция str_split() с указанием длины куска делит строку на фрагменты указанной длины. Аналог chunk_split(), но возвращает массив.
$code = '1234567890';
$blocks = str_split($code, 3);
print_r($blocks);Array
(
[0] => 123
[1] => 456
[2] => 789
[3] => 0
)Цель: разбивка на блоки (номера телефонов, коды).
Как ограничить количество элементов массива при разбиении?
Третий параметр explode() - limit. Если положительный, массив будет содержать не более limit элементов, последний элемент - остаток строки. Если отрицательный - убирает последние |limit| элементов.
$csv = 'a,b,c,d';
$limited = explode(',', $csv, 3);
print_r($limited);Array
(
[0] => a
[1] => b
[2] => c,d
)Случаи использования: парсинг заголовков (первые N полей), экономия памяти.
Общие проблемы и решения:
- Пустые элементы. Если разделитель идёт подряд или в начале/конце строки, explode вернёт пустые строки. Удалить их можно через array_filter() или передать PREG_SPLIT_NO_EMPTY в preg_split().
- Разделитель не найден. explode вернёт массив с одним элементом (всей строкой). Проверять через count() или str_contains().
- Многобайтовые строки. explode не работает с кодировками, где символ занимает несколько байт (UTF-8) - это не влияет на explode, так как делит по байтовой последовательности. Но для str_split нужно использовать mb_str_split().
- Спецсимволы в explode. Если разделитель содержит символы, которые в регулярных выражениях считаются специальными (например, точка), их не нужно экранировать - explode работает с литеральной строкой.
Расширенные примеры разбиения строк в PHP
Ниже приведены примеры, демонстрирующие нестандартные случаи и комбинации функций.
Разбиение CSV с учётом кавычек
Стандартный explode не справится с полями, содержащими разделитель внутри кавычек. Используется str_getcsv() или preg_split() с более сложным шаблоном.
$csv = 'Иван,Петров,"ул. Ленина, д.5",Москва';
$row = str_getcsv($csv);
print_r($row);Array
(
[0] => Иван
[1] => Петров
[2] => ул. Ленина, д.5
[3] => Москва
)Комментарий: str_getcsv() автоматически обрабатывает экранирование кавычек и разделитель внутри поля.
Разбиение по нескольким разделителям с удалением пустых строк
Использование preg_split() с флагом PREG_SPLIT_NO_EMPTY.
$str = 'first;;second, third|fourth';
$delimiters = '/[;,|]+/';
$parts = preg_split($delimiters, $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($parts);Array
(
[0] => first
[1] => second
[2] => third
[3] => fourth
)Преобразование строки в ассоциативный массив через explode и array_chunk
Если строка содержит пары ключ=значение, разделённые &, можно получить ассоциативный массив.
$query = 'name=Иван&age=30&city=Москва';
$pairs = explode('&', $query);
$assoc = [];
foreach ($pairs as $pair) {
list($key, $value) = explode('=', $pair, 2);
$assoc[$key] = $value;
}
print_r($assoc);Array
(
[name] => Иван
[age] => 30
[city] => Москва
)Разбиение на части с сохранением символов новой строки
Иногда надо разделить текст на абзацы по двойному переносу строки, но оставить сами переносы. Используется preg_split() с захватывающей группой и флагом PREG_SPLIT_DELIM_CAPTURE.
$text = "Первый абзац.\n\nВторой абзац.\n\nТретий.";
$paragraphs = preg_split('/(\n\n)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($paragraphs);Array
(
[0] => Первый абзац.
[1] =>
[2] => Второй абзац.
[3] =>
[4] => Третий.
)Теперь можно воссоздать исходный текст, соединив массив обратно.
Работа с многобайтовыми разделителями (кириллица, эмодзи)
Если строка содержит многобайтовый разделитель, explode работать будет корректно, так как ищет точную последовательность байт. Но для регулярных выражений нужен модификатор u.
$emojiLine = '???';
$chars = mb_str_split($emojiLine); // правильный способ для UTF-8
print_r($chars);
// explode по разделителю в UTF-8
$list = 'a?b?c';
$arr = explode('?', $list);
print_r($arr);Array
(
[0] => ?
[1] => ?
[2] => ?
)
Array
(
[0] => a
[1] => b
[2] => c
)Комбинирование explode с array_map для преобразования данных
Привести все элементы к числу или обрезать пробелы.
$nums = ' 10, 20 , 30 ';
$clean = array_map('trim', explode(',', $nums));
$ints = array_map('intval', $clean);
print_r($ints);Array
(
[0] => 10
[1] => 20
[2] => 30
)