7

Ошибка "Невозможно использовать объект типа stdClass как массив"

1

Я столкнулся с странной ошибкой при использовании функции 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 ответ(ов)

2

Вы должны получить доступ к нему, используя ->, так как это объект.

Измените ваш код с:

$result['context'];

На:

$result->context;
1

У меня сегодня возникла такая же проблема, и я решил её следующим образом:

Если вы вызываете json_decode($somestring), то получите объект, и доступ к его элементам можно осуществлять как $object->key. Однако, если вы вызываете json_decode($somestring, true), то получите ассоциативный массив и сможете обращаться к элементам как $array['key'].

0

Как указывает Документация PHP:

print_r — Выводит информацию о переменной в читаемом формате

Когда мы используем json_decode();, возвращаемый тип будет объектом stdClass. Аргументы, которые необходимо передать в print_r(), должны быть либо массивом, либо строкой. Следовательно, мы не можем передать объект в print_r(). Я нашел два способа справиться с этой ситуацией.

  1. Преобразование объекта в массив.

Это можно сделать следующим образом:

$a = (array)$object;
  1. Доступ к свойству объекта.

Как уже упоминалось, когда вы используете функцию 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

http://php.net/manual/en/function.var-dump.php

http://php.net/manual/en/function.var-export.php

0

Попробуйте что-то подобное!

Вместо того чтобы получать контекст так, как вы делали ранее (это работает для получения индекса массива):

$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;
}
0

Чтобы получить массив в результате декодирования JSON-строки, вам необходимо установить второй параметр функции json_decode в значение true.

$result = json_decode($json_string, true);
$context = $result['context'];

В противном случае $result будет представлять собой объект типа stdClass, но вы всё равно сможете получить доступ к значениям как к объекту.

$result = json_decode($json_string);
$context = $result->context;

Таким образом, если вам нужен массив, обязательно указывайте второй параметр как true.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь