Ошибка "Невозможно использовать объект типа stdClass как массив"
Я столкнулся с странной ошибкой при использовании функции json_decode(). Данные декодируются правильно (это подтверждается использованием print_r), но когда я пытаюсь получить доступ к информации внутри массива, я получаю следующую ошибку:
Fatal error: Cannot use object of type stdClass as array in
C:\Users\Dail\software\abs.php on line 108
Я пытался выполнить: $result['context'], где $result содержит данные, возвращенные функцией json_decode().
Как я могу получить доступ к значениям внутри этого массива?
5 ответ(ов)
Вы должны получить доступ к нему, используя ->, так как это объект.
Измените ваш код с:
$result['context'];
На:
$result->context;
У меня сегодня возникла такая же проблема, и я решил её следующим образом:
Если вы вызываете json_decode($somestring), то получите объект, и доступ к его элементам можно осуществлять как $object->key. Однако, если вы вызываете json_decode($somestring, true), то получите ассоциативный массив и сможете обращаться к элементам как $array['key'].
Как указывает Документация PHP:
print_r — Выводит информацию о переменной в читаемом формате
Когда мы используем json_decode();, возвращаемый тип будет объектом stdClass. Аргументы, которые необходимо передать в print_r(), должны быть либо массивом, либо строкой. Следовательно, мы не можем передать объект в print_r(). Я нашел два способа справиться с этой ситуацией.
- Преобразование объекта в массив.
Это можно сделать следующим образом:
$a = (array)$object;
- Доступ к свойству объекта.
Как уже упоминалось, когда вы используете функцию json_decode();, она возвращает объект stdClass. Вы можете получить доступ к элементам объекта с помощью оператора ->.
$value = $object->key;
Также можно использовать несколько ключей для извлечения подэлементов, если объект содержит вложенные массивы.
$value = $object->key1->key2->key3...;
Существуют и другие альтернативы print_r(), такие как var_dump(); и var_export();.
P.S.: Кроме того, если вы установите второй параметр функции json_decode(); в true, то это автоматически преобразует объект в array();.
Вот некоторые ссылки для справки:
http://php.net/manual/en/function.print-r.php
Попробуйте что-то подобное!
Вместо того чтобы получать контекст так, как вы делали ранее (это работает для получения индекса массива):
$result['context']
попробуйте следующий вариант (это работает для получения объектов):
$result->context
Вот еще один пример (если $result содержит несколько значений данных):
Array
(
[0] => stdClass Object
(
[id] => 15
[name] => 1 Pc Meal
[context] => 5
[restaurant_id] => 2
[items] =>
[details] => 1 Thigh (or 2 Drums) along with Taters
[nutrition_fact] => {"":""}
[servings] => menu
[availability] => 1
[has_discount] => {"menu":0}
[price] => {"menu":"8.03"}
[discounted_price] => {"menu":""}
[thumbnail] => YPenWSkFZm2BrJT4637o.jpg
[slug] => 1-pc-meal
[created_at] => 1612290600
[updated_at] => 1612463400
)
)
Тогда попробуйте так:
foreach($result as $results)
{
$results->context;
}
Чтобы получить массив в результате декодирования JSON-строки, вам необходимо установить второй параметр функции json_decode в значение true.
$result = json_decode($json_string, true);
$context = $result['context'];
В противном случае $result будет представлять собой объект типа stdClass, но вы всё равно сможете получить доступ к значениям как к объекту.
$result = json_decode($json_string);
$context = $result->context;
Таким образом, если вам нужен массив, обязательно указывайте второй параметр как true.
Возвращение JSON из PHP-скрипта
Предпочтительный метод хранения массивов PHP: json_encode или serialize?
Самый быстрый способ проверить, является ли строка JSON в PHP?
Функции startsWith() и endsWith() в PHP
Как получить расширение файла в PHP?