Превращение строки в массив: сравнение функций explode, preg_split, str_split

Раздел: Работа с массивами в PHP -> Преобразование массивов

При работе с данными в 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
)

Разбиение строки на массив по разделителю PHP - comments

En
Php строка в массив по разделителю (php)