Способы создания массива из переменных в PHP

Раздел: Основы PHP -> Основы PHP: переменные и типы

Различные способы преобразования в массив в PHP

Как преобразовать любую переменную в массив с помощью приведения типа (array)?

Оператор приведения (array) является базовым средством для преобразования скалярных значений, объектов и null в массив. Он часто применяется для унификации данных, когда функция ожидает массив, а передана строка или число.


<?php
$value = 42;
$array = (array) $value;
print_r($array);
?>
Array ( [0] => 42 )

Пример с булевым значением:


$flag = true;
$arr = (array) $flag;
print_r($arr);
Array ( [0] => 1 )

Для null возвращается пустой массив:


$nothing = null;
$arr = (array) $nothing;
var_dump($arr);
array(0) { }

Проблема: при приведении строки или числа создаётся массив с одним элементом, что может быть неочевидно для разработчика. Кроме того, для объектов приводятся только публичные свойства, а остальные игнорируются. Ошибка возникает, если попытаться привести ресурс или замыкание.

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

Функция explode() делит строку на части по указанному разделителю и возвращает массив этих частей. Это самый распространённый способ для работы с CSV-данными, URL-параметрами и другими текстовыми форматами.


<?php
$data = "красный,синий,зелёный";
$colors = explode(",", $data);
print_r($colors);
?>
Array ( [0] => красный [1] => синий [2] => зелёный )

Можно ограничить количество элементов с помощью третьего параметра limit:


$parts = explode(",", "a,b,c,d", 3);
print_r($parts);
Array ( [0] => a [1] => b [2] => c,d )

Типичная ошибка: если разделитель не встречается в строке, explode возвращает массив с одним элементом - исходной строкой. Пустая строка в качестве разделителя вызывает предупреждение E_WARNING и возвращает false. Для пустой строки результатом будет массив из одного пустого элемента.

Как разбить строку на массив символов?

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


<?php
$word = "PHP";
$chars = str_split($word);
print_r($chars);
?>
Array ( [0] => P [1] => H [2] => P )

Можно указать длину фрагмента - тогда строка режется на куски заданного размера:


$string = "1234567890";
$chunks = str_split($string, 3);
print_r($chunks);
Array ( [0] => 123 [1] => 456 [2] => 789 [3] => 0 )

Проблема с многобайтовыми кодировками (UTF-8): str_split() делит строку по байтам, что ломает символы, состоящие из нескольких байтов. Для корректной работы с кириллицей или эмодзи следует использовать mb_str_split() (доступна с PHP 7.4).


$text = "Привет";
$wrong = str_split($text);
$correct = mb_str_split($text);
print_r($wrong);
print_r($correct);
Array ( [0] => Ð [1] =>  [2] => Ñ [3] =>  ... )
Array ( [0] => П [1] => р [2] => и [3] => в [4] => е [5] => т )

Как разбить строку по регулярному выражению?

Функция preg_split() делит строку на массив частей, используя регулярное выражение в качестве разделителя. Это гибкий инструмент для сложных шаблонов, например, разделение по нескольким разделителям или с учётом пробелов.


<?php
$text = "яблоко, банан; вишня. апельсин";
$pattern = "/[;,.]\\s*/";
$fruits = preg_split($pattern, $text);
print_r($fruits);
?>
Array ( [0] => яблоко [1] => банан [2] => вишня [3] => апельсин )

Флаг PREG_SPLIT_NO_EMPTY удаляет пустые элементы:


$csv = "a,,b,c";
$parts = preg_split("/,/", $csv, -1, PREG_SPLIT_NO_EMPTY);
print_r($parts);
Array ( [0] => a [1] => b [2] => c )

Ошибки возникают при некорректном регулярном выражении - возвращается false. Также стоит помнить о производительности: сложные шаблоны могут замедлить разбор больших строк.

Как получить массив из JSON-строки?

Функция json_decode() с параметром true преобразует JSON-строку в ассоциативный массив. Это стандартный способ работы с данными от внешних API или конфигурационных файлов.


<?php
$json = '{"name":"Иван","age":30}';
$array = json_decode($json, true);
print_r($array);
?>
Array ( [name] => Иван [age] => 30 )

Если второй параметр опущен или равен false, результатом будет объект stdClass.

Проблема: невалидный JSON возвращает null. Ошибки можно получить через json_last_error(). Глубоко вложенные структуры потребляют много памяти; для больших данных рекомендуется потоковая обработка.

Как преобразовать объект в массив?

Приведение через (array) для объекта возвращает массив его публичных свойств. Приватные и защищённые свойства становятся недоступными. Для полного преобразования с рекурсией удобно использовать json_decode(json_encode($obj), true).


<?php
class User {
    public $name = "Анна";
    protected $email = "anna@example.com";
    private $password = "secret";
}
$user = new User();
$arr = (array) $user;
print_r($arr);
?>
Array ( [name] => Анна )

Для рекурсивного преобразования:


$fullArray = json_decode(json_encode($user), true);
print_r($fullArray);
Array ( [name] => Анна [email] => anna@example.com )

Проблема с циклическими ссылками в объектах: json_encode может выдать ошибку или бесконечную рекурсию. Не рекомендуется для сложных графов объектов. Также теряется типизация (числа становятся строками в JSON).

Расширенные примеры преобразования в массив

Ниже приведены более сложные и нестандартные сценарии с пояснениями и результатами.

1. Приведение (array) с массивоподобными объектами

Объекты, реализующие интерфейс ArrayAccess, ведут себя как массивы, но при приведении (array) возвращают только публичные свойства, а не элементы доступа:

Пример

class Collection implements ArrayAccess {
    private $items = ["a", "b"];
    public function offsetExists($offset) { /* ... */ }
    public function offsetGet($offset) { return $this->items[$offset]; }
    public function offsetSet($offset, $value) { /* ... */ }
    public function offsetUnset($offset) { /* ... */ }
    public $meta = "test";
}
$col = new Collection();
print_r((array) $col);
Array ( [meta] => test )

Для получения элементов через ArrayAccess нужно использовать iterator_to_array() или цикл.

2. Использование explode с отрицательным лимитом

Отрицательное значение limit удаляет указанное количество последних элементов:

Пример

$path = "home/user/docs/file.txt";
$parts = explode("/", $path, -2);
print_r($parts);
Array ( [0] => home [1] => user )

3. Разбиение строки на массив с помощью preg_split и захват разделителей

Флаг PREG_SPLIT_DELIM_CAPTURE включает разделители в результирующий массив:

Пример

$html = "

текст

блок
"; $tokens = preg_split("/<\\/?\\w+>/", $html, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); print_r($tokens);
Array ( [0] => 

[1] => текст [2] =>

[3] =>
[4] => блок [5] =>
)

4. Преобразование многомерного объекта с помощью рекурсивной функции

Для вложенных объектов, когда json_encode не подходит, можно написать собственную рекурсию:

Пример

function objectToArray($obj) {
    if (is_object($obj)) {
        $obj = get_object_vars($obj);
    }
    if (is_array($obj)) {
        return array_map(__FUNCTION__, $obj);
    }
    return $obj;
}
class Address {
    public $city = "Москва";
    public $street = "Тверская";
}
class Person {
    public $name = "Ольга";
    public $address;
    public function __construct() {
        $this->address = new Address();
    }
}
$person = new Person();
$arr = objectToArray($person);
print_r($arr);
Array ( [name] => Ольга [address] => Array ( [city] => Москва [street] => Тверская ) )

5. Получение массива из итератора через iterator_to_array

Многие встроенные классы (DirectoryIterator, ArrayIterator) реализуют Traversable. Функция iterator_to_array() копирует элементы в массив:

Пример

$iterator = new ArrayIterator([10, 20, 30]);
$array = iterator_to_array($iterator);
print_r($array);
Array ( [0] => 10 [1] => 20 [2] => 30 )

Параметр false сохраняет ключи, true переиндексирует.

6. Использование range для создания массива чисел

Хотя range не преобразует существующую переменную, он часто используется для генерации массива из диапазона:

Пример

$numbers = range(1, 5, 2); // шаг 2
print_r($numbers);
Array ( [0] => 1 [1] => 3 [2] => 5 )

Преобразовать в массив в PHP - comments

En
Php get array (php)