不能使用types为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错误)的标识符from-date你必须写:

 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); 

请参阅文档了解更多详情。

它不是一个数组,它是一个stdClasstypes的对象。

你可以像这样访问它:

 echo $oResult->context; 

更多信息在这里: 什么是PHP中的stdClass?

今天有同样的问题,就这样解决了:

如果你调用json_decode($somestring)你会得到一个对象,你需要访问像$object->key ,但是如果你调用json_decode($somestring, true)你将得到一个字典,可以像$array['key']

正如Php手册所说,

print_r – 打印关于variables的人类可读信息

当我们使用json_decode(); ,我们得到一个types为stdClass的对象作为返回types。 要在print_r()传递的参数应该是数组或string。 因此,我们不能在print_r()传递一个对象。 我find了两种方法来处理这个问题。

  1. 将对象转换为数组。
    这可以实现如下。

     $a = (array)$object; 
  2. 通过访问对象的关键字
    如前所述,当你使用json_decode(); 函数,它返回一个stdClass对象。 你可以在-> Operator的帮助下访问这个对象的元素。

     $value = $object->key; 

一,如果对象有嵌套数组,也可以使用多个键来提取子元素incase。

 $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 ]]] ) 

当param为false时,它将返回一个合适的phptypes。 您可以使用object.method范例获取该types的值。

当参数为true时,它将返回关联数组。

它会在错误时返回NULL。

如果你想通过数组获取值,请将assoc设置为true。

当你试图以$result['context']访问它时,你将它视为一个数组,它告诉你实际上正在处理一个对象的错误,那么你应该以$result->context

而不是使用括号使用对象操作符,例如我的基于数据库对象的数组被创build像这样在一个名为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'; ?> 

然后显示我检查的信息,看看是否已经设置了服务调用,并有一个大于0的计数记住它不是我引用的数组,因此我使用对象运算符“ – >”来访问logging,如下所示:

 <?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'; ?> 

我得到这个蓝色的错误,因为我的Facebooklogin突然停止工作(我也改变了主机),并抛出这个错误。 修复非常简单

这个问题是在这个代码中

  $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()函数期望一个数组,但是它会find一个对象。 简单的解决scheme是使用(数组)量词将PHP对象转换为数组。 以下是固定的代码。

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

注意在第一行中使用off array()量词。

改变它

 $results->fetch_array()