Как разбить строку на массив PHP с помощью explode

Чтобы разбить строку на массив PHP, передайте разделитель и исходную строку в explode(). Функция вернет части в исходном порядке. В статье вы найдете рабочий код для телефонов, списков и предложений, разберете параметр limit и выберете замену для CSV или нескольких разделителей.

Как в PHP разбить строку на массив по разделителю

Вызов explode() делит строку по одному фиксированному разделителю. Например, код разделит номер телефона на три строки.

<?php
$phone = '001-234-567678';
$parts = explode('-', $phone);

print_r($parts);
Array
(
    [0] => 001
    [1] => 234
    [2] => 567678
)

Первым аргументом explode() передайте разделитель, вторым – строку. Каждый элемент результата сохраняет тип строки, поэтому '001' не потеряет начальный ноль.

Синтаксис explode и параметры

Функция принимает разделитель, исходную строку и необязательный лимит. Сигнатура выглядит так:

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

Полное описание параметров есть в официальной документации PHP по explode(). Функция explode() возвращает массив строк. Переберите его через foreach или обратитесь к элементу по индексу.

  • $separator – строка-разделитель: дефис, пробел, запятая или несколько символов.
  • $string – строка, которую нужно разделить.
  • $limit – число частей или правило отсечения элементов.
Значение limitРезультат
Не заданоВсе части строки
Положительное числоНе больше указанного числа частей, последняя часть содержит остаток
0Одноэлементный массив с исходной строкой
Отрицательное числоВсе части без последних |limit| элементов

Положительный лимит ограничивает количество элементов. Отрицательный лимит убирает части с конца, а значение 0 обрабатывается как 1.

Как в PHP разделить строку по разделителю

Передайте точный разделитель первым аргументом explode(). Пробел, запятая и запятая с пробелом дадут разные массивы.

<?php
$phone = '001-234-567678';
$parts = explode('-', $phone);

foreach ($parts as $part) {
    echo $part . PHP_EOL;
}
001
234
567678

Один пробел подходит для предложения с одиночными пробелами между словами.

<?php
$sentence = 'PHP splits a sentence into words';
$words = explode(' ', $sentence);

print_r($words);
Array
(
    [0] => PHP
    [1] => splits
    [2] => a
    [3] => sentence
    [4] => into
    [5] => words
)

Для списка с единым форматом «, » можно сразу убрать запятую и следующий пробел.

<?php
$tags = 'php, backend, arrays';
$items = explode(', ', $tags);

print_r($items);
Array
(
    [0] => php
    [1] => backend
    [2] => arrays
)

Если пробел после запятой бывает не всегда, разделите по запятой и обработайте пробелы через trim().

Параметр limit: положительный, отрицательный и ноль

Параметр limit меняет число элементов и содержимое последней части. Каждый вариант удобно проверить отдельным коротким примером.

Положительный limit

Значение 2 дает максимум две части. Вторая часть получает весь оставшийся текст.

<?php
$text = 'one two three four';
$result = explode(' ', $text, 2);

print_r($result);
Array
(
    [0] => one
    [1] => two three four
)

Отрицательный limit

Значение -2 убирает два последних элемента результата.

<?php
$text = 'one two three four';
$result = explode(' ', $text, -2);

print_r($result);
Array
(
    [0] => one
    [1] => two
)

Нулевой limit

Нулевой лимит работает как единица и возвращает исходную строку одним элементом.

<?php
$text = 'one two three';
$result = explode(' ', $text, 0);

print_r($result);
Array
(
    [0] => one two three
)

Граничные случаи explode

Граничные значения меняют состав массива. Учитывайте их при обработке данных из формы, файла или API.

Если разделитель отсутствует, положительный лимит возвращает исходную строку одним элементом. При отрицательном лимите результатом становится пустой массив.

<?php
$positive = explode('-', 'abc', 2);
$negative = explode('-', 'abc', -1);

print_r($positive);
print_r($negative);
Array
(
    [0] => abc
)
Array
(
)

Пустая строка без лимита дает один пустой элемент. Разделитель в начале или конце строки добавляет пустой элемент с соответствующей стороны. Два разделителя подряд оставляют пустую строку между частями.

<?php
$empty = explode(',', '');
$edges = explode(',', ',a,b,');
$double = explode(',', 'a,,b');

var_dump($empty, $edges, $double);
array(1) {
  [0]=>
  string(0) ""
}
array(4) {
  [0]=>
  string(0) ""
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "b"
  [3]=>
  string(0) ""
}
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(0) ""
  [2]=>
  string(1) "b"
}

Пустой разделитель вызывает ValueError в PHP 8.0 и более новых версиях. В более ранних версиях PHP такой вызов возвращал false. Для кусков фиксированной длины используйте str_split() или mb_str_split().

Как очистить и разобрать результат

После разделения элементы могут содержать пробелы и пустые строки. Сначала уберите пробелы у каждого элемента, затем удалите пустые значения.

<?php
$input = ' php,  , mysql,  javascript ';
$parts = explode(',', $input);
$parts = array_map('trim', $parts);
$parts = array_values(array_filter($parts, 'strlen'));

print_r($parts);
echo count($parts);
Array
(
    [0] => php
    [1] => mysql
    [2] => javascript
)
3

array_map('trim', ...) очищает пробелы у каждого элемента. Вызов array_filter($parts, 'strlen') удаляет строки нулевой длины и сохраняет строку '0'. array_values() возвращает последовательные индексы.

Разложите первые значения по переменным через list() или короткий синтаксис массивов.

<?php
$coordinates = explode(':', '55.75:37.61');
[$latitude, $longitude] = $coordinates;

var_dump($latitude, $longitude);
echo count($coordinates);
string(5) "55.75"
string(5) "37.61"
2

Запись list($latitude, $longitude) = $coordinates; дает тот же результат. Перед распаковкой пользовательских данных посчитайте части через count() и обработайте слишком короткий массив.

Когда explode не подходит

explode() принимает один фиксированный разделитель. Выберите другую функцию, если строка содержит несколько разделителей, CSV-кавычки или куски заданной длины.

ЗадачаФункцияЧто она учитывает
Несколько разделителейpreg_split()Регулярное выражение
CSV с кавычкамиstr_getcsv()Кавычки, разделитель и экранирование полей
Куски фиксированной длины в байтахstr_split()Размер части в байтах
Куски фиксированной длины в символахmb_str_split()Многобайтовую кодировку

Для нескольких разделителей передайте регулярное выражение в preg_split(). Параметр -1 оставляет все части, а флаг PREG_SPLIT_NO_EMPTY убирает пустые элементы.

<?php
$text = 'php, mysql; javascript';
$parts = preg_split('/[,;]\s*/', $text, -1, PREG_SPLIT_NO_EMPTY);

print_r($parts);
Array
(
    [0] => php
    [1] => mysql
    [2] => javascript
)

Для CSV с запятой внутри поля используйте str_getcsv(). Второй аргумент задает разделитель, третий – символ обрамления, четвертый – символ экранирования.

<?php
$line = '"Smith, John",42,"New York"';
$fields = str_getcsv($line, ',', '"', '');

print_r($fields);
Array
(
    [0] => Smith, John
    [1] => 42
    [2] => New York
)

Функция str_split() делит ASCII-строку на куски заданной длины.

<?php
$word = 'abcdef';
$chunks = str_split($word, 2);

print_r($chunks);
Array
(
    [0] => ab
    [1] => cd
    [2] => ef
)

Для многобайтового текста возьмите mb_str_split() и укажите кодировку UTF-8.

<?php
$text = '日本語文字列';
$chunks = mb_str_split($text, 2, 'UTF-8');

print_r($chunks);
Array
(
    [0] => 日本
    [1] => 語文
    [2] => 字列
)

Обратная операция: implode

Функция implode() собирает элементы массива обратно в строку. Ее параметры и примеры описаны на странице implode() в документации PHP.

<?php
$parts = ['001', '234', '567678'];
$phone = implode('-', $parts);

echo $phone;
001-234-567678

Связка explode() и implode() помогает изменить отдельный элемент и собрать строку с тем же разделителем.

Ошибки при разбиении строки в PHP

Двойные пробелы, две запятые и разделитель по краю создают пустые элементы. Очистите части через array_map('trim', $parts), затем примените array_filter($parts, 'strlen'). Такой фильтр сохраняет строку '0'.

Не применяйте explode() к CSV с запятыми внутри кавычек. Функция увидит каждую запятую и разделит одно поле на несколько частей. Возьмите str_getcsv().

Соблюдайте порядок аргументов: сначала идет разделитель, затем исходная строка. Вызов explode($string, $separator) ищет значение первой переменной внутри второй.

<?php
$string = 'a,b,c';
$separator = ',';
$result = explode($string, $separator);

print_r($result);
Array
(
    [0] => ,
)

Функции split() в современном PHP нет. Не считайте explode() ее прямой заменой: split() принимала регулярное выражение, а explode() ищет буквальный разделитель.

Многобайтовый разделитель передавайте целой последовательностью символов. Для разбиения UTF-8-строки на отдельные символы выбирайте mb_str_split(), потому что str_split() работает с байтами.

Совет от нашей редакции: сначала определите формат входной строки, затем выберите одну функцию под один разделитель, регулярное выражение, CSV или фиксированный размер частей.

Комментарии

Оставьте свой комментарий
Пока никто не оставил комментариев