Ошибка "Невозможно использовать объект типа 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-скрипта
Когда использовать 'self' вместо '$this'?
Функции startsWith() и endsWith() в PHP
Что такое потокобезопасность и непотокобезопасность в PHP?
Как получить расширение файла в PHP?