Как преобразовать JSON в массив PHP, а не в объект через json_decode()?
Используйте второй параметр json_decode()
Решение вашей проблемы очень простое. Функция json_decode() принимает второй необязательный параметр — булевый флаг $associative. Когда он равен true, функция возвращает ассоциативный массив вместо объекта stdClass.
Вот как это работает:
<?php
$json = '{"name":"Иван","age":30,"city":"Москва"}';
// Передаём true вторым аргументом
$data = json_decode($json, true);
// Теперь это массив!
echo $data['name']; // Выведет "Иван"
echo $data['age']; // Выведет 30
echo $data['city']; // Выведет "Москва"
// Проверим тип
var_dump($data); // array(3) { ["name"]=> string(8) "Иван" ["age"]=> int(30) ["city"]=> string(12) "Москва" }
?>
Почему это работает?
По умолчанию json_decode() создаёт объекты класса stdClass. Это поведение выбрано для совместимости с JSON-стандартом, где данные представляются как объекты. Однако PHP позволяет легко переключиться на массивы.
Параметр $associative может принимать три значения:
- false (по умолчанию) — возвращает объекты
- true — возвращает ассоциативные массивы
- null — использует настройки по умолчанию (объекты)
Работа со вложенными структурами
Флаг работает рекурсивно для всех уровней вложенности:
<?php
$json = '{
"user": {
"name": "Мария",
"contacts": {
"email": "maria@example.com",
"phone": "+7-999-123-45-67"
}
}
}';
$data = json_decode($json, true);
// Доступ ко всем уровням как к массивам
echo $data['user']['name']; // Мария
echo $data['user']['contacts']['email']; // maria@example.com
?>
Важные моменты
- Всегда проверяйте успешность декодирования через
json_last_error() - JSON-массивы (в квадратных скобках) всегда преобразуются в обычные индексированные массивы, независимо от флага
- Если JSON содержит пустой объект
{}, приtrueполучите пустой массив, приfalse— пустой stdClass
Теперь вы можете спокойно работать с данными как с массивами. Удачи в разработке!
<<Альтернативный подход: приведение типов
Если по какой-то причине вы не хотите менять вызов json_decode(), можно преобразовать полученный объект в массив с помощью приведения типов:
<?php
$json = '{"name":"Иван","age":30}';
$object = json_decode($json);
$array = (array) $object;
echo $array['name']; // Иван
?>
Однако этот способ менее надёжен для вложенных структур — дочерние объекты останутся объектами. Для глубокого преобразования пришлось бы писать рекурсивную функцию или использовать json_decode($json, true).
Рекомендация: используйте второй параметр true — это самый простой и эффективный способ, поддерживаемый во всех версиях PHP.