Как превратить объект PHP в ассоциативный массив: 3 рабочих способа

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

От объекта к массиву: почему это нужно и как не наступить на грабли

Каждый PHP-разработчик рано или поздно сталкивается с задачей: есть объект (например, из API, базы данных или библиотеки), а нужен обычный ассоциативный массив. Вроде бы элементарная операция, но дьявол, как всегда, в деталях. Неправильное преобразование может привести к потере данных, неожиданным типам или фатальным ошибкам.

В этой статье мы разберём три основных подхода к конвертации PHP объекта в ассоциативный массив, сравним их производительность, глубину обработки и подводные камни. Вы узнаете, какой метод выбрать для 90% задач, а какой лучше оставить для лабораторных экспериментов. Поехали!

Метод 1: Волшебное приведение типа (array)

Самый очевидный и лаконичный способ — использовать приведение типа: (array) $object. Этот метод встроен в PHP и работает «из коробки». Давайте посмотрим на примере.

<?php
$user = new stdClass();
$user->name = 'Алексей';
$user->age = 28;
$user->email = 'alex@example.com';

$array = (array) $user;
print_r($array);
?>

Результат:

Array
(
    [name] => Алексей
    [age] => 28
    [email] => alex@example.com
)

Выглядит идеально? Почти. Но есть нюансы.

Плюсы метода (array)

  • Простота и скорость — одна операция, никаких циклов.
  • Работает с любыми объектами, включая экземпляры пользовательских классов.
  • Сохраняет public-свойства объекта.

Минусы и подводные камни

  • Не рекурсивный — если свойство объекта само является объектом, оно не будет преобразовано в массив. Вы получите вложенный объект внутри массива.
  • Проблема с private/protected свойствами — они попадают в массив, но с именами, содержащими символы null (\0). Это ломает сериализацию.
  • Изменение ключей — для встроенных классов (DateTime, PDOStatement) поведение может быть непредсказуемым.

Пример проблемы с private свойством:

<?php
class User {
    public $name = 'Иван';
    private $password = 'secret123';
}

$user = new User();
$array = (array) $user;
var_dump(array_keys($array));
// Выведет: array(2) { [0]=> string(4) "name" [1]=> string(17) "\0User\0password" }
?>

Как видите, ключ \0User\0password — это не то, что вы хотели бы видеть в своём коде.

Метод 2: JSON-мост (json_decode + json_encode)

Второй популярный подход — сначала сериализовать объект в JSON, а затем декодировать его в массив. Это решает проблему рекурсии и приватных свойств, но добавляет накладные расходы.

<?php
$object = new stdClass();
$object->name = 'Мария';
$object->skills = ['PHP', 'JavaScript', 'Python'];

$array = json_decode(json_encode($object), true);
print_r($array);
?>

Результат:

Array
(
    [name] => Мария
    [skills] => Array
        (
            [0] => PHP
            [1] => JavaScript
            [2] => Python
        )
)

Теперь вложенный массив skills тоже стал массивом, а не объектом. Отлично!

Когда этот метод выручает

  • Глубоко вложенные структуры — рекурсия обрабатывается автоматически.
  • Чистота данных — никаких служебных символов в ключах.
  • Совместимость — если вы уже работаете с JSON (API, базы данных), это естественный выбор.

Недостатки JSON-подхода

  • Потеря типов — целые числа останутся целыми, но объекты типа DateTime преобразуются в строки. Объекты с методами потеряют поведение.
  • Проблемы с UTF-8 — если в данных есть невалидный UTF-8, json_encode вернёт false.
  • Производительность — двойная конвертация (объект → строка → массив) медленнее, чем прямое приведение.
  • Не все объекты сериализуемы — ресурсы, дескрипторы файлов и некоторые специальные объекты вызовут ошибку.

Метод 3: Рекурсивная пользовательская функция

Когда стандартных методов недостаточно, на помощь приходит кастомная функция. Она даёт полный контроль над процессом преобразования объекта PHP в ассоциативный массив.

<?php
function objectToArray($data) {
    if (is_object($data)) {
        $data = get_object_vars($data);
    }

    if (is_array($data)) {
        return array_map(__FUNCTION__, $data);
    }

    return $data;
}

// Пример использования
class Address {
    public $city = 'Москва';
    public $street = 'Тверская';
}

class Person {
    public $name = 'Дмитрий';
    public $address;
    
    public function __construct() {
        $this->address = new Address();
    }
}

$person = new Person();
$result = objectToArray($person);
print_r($result);
?>

Результат:

Array
(
    [name] => Дмитрий
    [address] => Array
        (
            [city] => Москва
            [street] => Тверская
        )
)

Преимущества кастомной функции

  • Полный контроль — вы решаете, как обрабатывать каждый тип данных.
  • Гибкость — можно добавить логику для специфических классов, фильтрацию или трансформацию.
  • Рекурсия — обрабатывает любую глубину вложенности.

Когда стоит писать свою функцию

  • У вас есть объекты с приватными свойствами, которые нужно преобразовать особым образом.
  • Вы хотите игнорировать null-значения или преобразовывать даты.
  • Нужно сохранить camelCase/Snake_case ключей.
  • Производительность критична, и JSON-мост слишком тяжёл.

Потенциальные проблемы

  • Бесконечная рекурсия — если объект ссылается сам на себя (циклические ссылки), функция упадёт с ошибкой.

Блоги

Рекомендаций по книгам