不能使用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了两种方法来处理这个问题。
-
将对象转换为数组。
这可以实现如下。$a = (array)$object;
-
通过访问对象的关键字
如前所述,当你使用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()