Intereting Posts
счетчик числа кликов по ссылкам в php Проверьте, существует ли значение в result_array () Работа с битовым кодом Найти, какая часть Html недействительна с PHP Правила кодирования PHP? Сохранить кодированное изображение base64 в файл в PHP Можно ли использовать RegEx пользователя? Является ли предотвращение XSS и SQL Injection так же просто, как это делает Залог корзины Woocommerce как я могу опубликовать значение текстового поля, которое динамически создается jquery Gettext для работы с контекстом (pgettext) Как использовать промежуточное ПО auth для управления логином / перенаправлением разных типов пользователей? Как получить значение атрибута с пространством имен Загружать прикрепленные файлы из проекта сообщений в API Gmail через PHP «Требуется атрибут If-Match или If-None-Match или атрибут entry etag» Ошибка при попытке обновить контакт в контактах google с помощью Zend Framework

Нельзя использовать объект типа 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()

Как читать значения внутри этого массива?

Используйте второй параметр json_decode чтобы он возвращал массив:

 $result = json_decode($data, true); 

Функция json_decode() возвращает объект по умолчанию.

Вы можете получить доступ к следующим данным:

 var_dump($result->context); 

Если у вас есть идентификаторы, такие как from-date (дефис приведет к ошибке PHP при использовании вышеуказанного метода), вы должны написать:

 var_dump($result->{'from-date'}); 

Если вы хотите массив, вы можете сделать что-то вроде этого:

 $result = json_decode($json, true); 

Или выделите объект в массив:

 $result = (array) json_decode($json); 

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

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

 $result['context']; 

Для того, чтобы:

 $result->context; 

Используйте true в качестве второго параметра для json_decode . Это расшифровывает json в ассоциативный массив вместо экземпляров stdObject :

 $my_array = json_decode($my_json, true); 

Дополнительную информацию см. В документации .

Это не массив, это объект типа stdClass.

Вы можете получить доступ к нему следующим образом:

 echo $oResult->context; 

Подробнее здесь: Что такое stdClass в PHP?

Сегодня такая же проблема решена:

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

Как говорится в руководстве Php ,

print_r – печатает удобочитаемую информацию о переменной

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

  1. Передача объекта в массив.
    Это можно сделать следующим образом.

     $a = (array)$object; 
  2. При доступе к ключу объекта
    Как упоминалось ранее, когда вы используете json_decode(); function, он возвращает объект stdClass. вы можете получить доступ к элементам объекта с помощью -> Operator.

     $value = $object->key; 

Один из них также может использовать несколько ключей для извлечения подэлементов, если объект имеет вложенные массивы.

 $value = $object->key1->key2->key3...; 

Это другие варианты print_r() , например var_dump(); и var_export();

PS : Также, если вы установили второй параметр 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

Вы можете преобразовать объект stdClass в массив, например:

 $array = (array)$stdClass; 

stdClsss для массива

Вот подпись функции:

 mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] ) 

Если параметр равен false, который по умолчанию, он вернет соответствующий тип php. Вы получаете значение этого типа с использованием парадигмы object.method.

Когда параметр равен true, он возвращает ассоциативные массивы.

Он вернет NULL при ошибке.

Если вы хотите получить значение через массив, установите для него значение true.

Когда вы пытаетесь получить к нему доступ в виде $result['context'] , вы рассматриваете его как массив, ошибка говорит вам, что вы на самом деле имеете дело с объектом, тогда вы должны получить к нему доступ в виде $result->context

вместо использования скобок используется оператор объекта, например, мой массив на основе объекта базы данных создается таким образом в классе DB:

 class DB { private static $_instance = null; private $_pdo, $_query, $_error = false, $_results, $_count = 0; private function __construct() { try{ $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') .';dbname=' . Config::get('mysql/db') , Config::get('mysql/username') ,Config::get('mysql/password') ); } catch(PDOException $e) { $this->_error = true; $newsMessage = 'Sorry. Database is off line'; $pagetitle = 'Teknikal Tim - Database Error'; $pagedescription = 'Teknikal Tim Database Error page'; include_once 'dbdown.html.php'; exit; } $headerinc = 'header.html.php'; } public static function getInstance() { if(!isset(self::$_instance)) { self::$_instance = new DB(); } return self::$_instance; } public function query($sql, $params = array()) { $this->_error = false; if($this->_query = $this->_pdo->prepare($sql)) { $x = 1; if(count($params)) { foreach($params as $param){ $this->_query->bindValue($x, $param); $x++; } } } if($this->_query->execute()) { $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); $this->_count = $this->_query->rowCount(); } else{ $this->_error = true; } return $this; } public function action($action, $table, $where = array()) { if(count($where) ===3) { $operators = array('=', '>', '<', '>=', '<='); $field = $where[0]; $operator = $where[1]; $value = $where[2]; if(in_array($operator, $operators)) { $sql = "{$action} FROM {$table} WHERE {$field} = ?"; if(!$this->query($sql, array($value))->error()) { return $this; } } } return false; } public function get($table, $where) { return $this->action('SELECT *', $table, $where); public function results() { return $this->_results; } public function first() { return $this->_results[0]; } public function count() { return $this->_count; } } 

для доступа к информации я использую этот код в скрипте контроллера:

 <?php $pagetitle = 'Teknikal Tim - Service Call Reservation'; $pagedescription = 'Teknikal Tim Sevice Call Reservation Page'; require_once $_SERVER['DOCUMENT_ROOT'] .'/core/init.php'; $newsMessage = 'temp message'; $servicecallsdb = DB::getInstance()->get('tt_service_calls', array('UserID', '=','$_SESSION['UserID'])); if(!$servicecallsdb) { // $servicecalls[] = array('ID'=>'','ServiceCallDescription'=>'No Service Calls'); } else { $servicecalls = $servicecallsdb->results(); } include 'servicecalls.html.php'; ?> 

затем, чтобы отобразить информацию, которую я проверяю, чтобы проверить, установлено ли servicecalls и имеет счет больше 0, помните, что это не массив, на который я ссылаюсь, поэтому я обращаюсь к записям с оператором объекта «->» следующим образом:

 <?php include $_SERVER['DOCUMENT_ROOT'] .'/includes/header.html.php';?> <!--Main content--> <div id="mainholder"> <!-- div so that page footer can have a minum height from the header --> <h1><?php if(isset($pagetitle)) htmlout($pagetitle);?></h1> <br> <br> <article> <h2></h2> </article> <?php if (isset($servicecalls)) { if (count ($servicecalls) > 0){ foreach ($servicecalls as $servicecall) { echo '<a href="/servicecalls/?servicecall=' .$servicecall->ID .'">' .$servicecall->ServiceCallDescription .'</a>'; } }else echo 'No service Calls'; } ?> <a href="/servicecalls/?new=true">Raise New Service Call</a> </div> <!-- Main content end--> <?php include $_SERVER['DOCUMENT_ROOT'] .'/includes/footer.html.php'; ?> 

Я получил эту ошибку из-за синего, потому что мой вход в facebook с трудом прекратил работу (я также изменил хосты) и выбросил эту ошибку. Исправить это очень просто

Проблема была в этом коде

  $response = (new FacebookRequest( FacebookSession::newAppSession($this->appId, $this->appSecret), 'GET', '/oauth/access_token', $params ))->execute()->getResponse(true); if (isset($response['access_token'])) { <---- this line gave error return new FacebookSession($response['access_token']); } 

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

  $response = (array) (new FacebookRequest( FacebookSession::newAppSession($this->appId, $this->appSecret), 'GET', '/oauth/access_token', $params ))->execute()->getResponse(true); 

Обратите внимание на использование байта блока array () в первой строке.

Измените его для

 $results->fetch_array()