2011-07-25 59 views
359

我收到一個奇怪的錯誤,使用json_decode()。它正確解碼的數據(我看到它使用print_r),但是當我嘗試進入信息數組裏面我得到:不能使用stdClass類型的對象作爲數組嗎?

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

返回的數據

如何讀取數組中的值?

+8

$ result = json_decode('the string',true);添加true將返回結果作爲數組而不是stdClass。 – Nepaluz

回答

41

它不是一個數組,它是一個類型爲stdClass的對象。

您可以像這樣訪問:

echo $oResult->context; 

此處瞭解詳情:What is stdClass in PHP?

61

使用true作爲第二個參數json_decode。這將JSON解碼成一個關聯數組,而不是stdObject實例:

$my_array = json_decode($my_json, true); 

詳情請參閱the documentation

565

使用的json_decode的第二個參數,使之返回的數組:

$result = json_decode($data, true); 
163

json_decode()默認返回一個對象的功能。

您可以訪問的數據是這樣的:

var_dump($result->context); 

如果你有標識符喜歡from-date(連字符將採用上述方法時,會導致PHP錯誤),你必須寫:

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

如果你想要一個陣列,你可以這樣做:

$result = json_decode($json, true); 

O ř投的對象到一個數組:

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

花了一段時間找到這個時,試圖找到一種方式來引用在由knockoutjs設置的_destroy值,所以+1 – deltree

2

,而不是使用括號使用被這樣在一個名爲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'; ?> 
105

必須使用->因爲它的對象訪問它。

更改代碼:

$result['context']; 

要:

$result->context; 
+0

我遇到的問題是試圖在有條件的'if($ result- > context = $ var)'這會導致屬性被設置爲var並返回true,無論如何。 – STWilson

+1

@STWilson你應該使用一個double等於'==',在你當前的狀態下,通過使用一個等於'='的''賦值給'$ result-> context'。 'if語句'會讀取它,就好像它是空的一樣,如果'$ var'具有值,那麼這意味着它不是空的並且總是返回true。 – Jimvirle

+0

謝謝!這應該被標記爲正確的答案... – Roberto

6

可以stdClass的對象轉換爲數組,如:

$array = (array)$stdClass; 

stdClsss to array

4

這裏是在F聯合簽名:

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

當param爲false時,它是默認值,它將返回一個合適的php類型。您可以使用object.method範例獲取該類型的值。

當參數爲true時,它將返回關聯數組。

錯誤時將返回NULL。

如果要通過數組提取值,請將assoc設置爲true。

31

今天有同樣的問題,解決這樣的:

如果你打電話json_decode($somestring),你會得到一個對象,你需要訪問諸如$object->key,但如果u叫json_decode($somestring, true)你會得到一個字典,並能夠訪問諸如$array['key']

18

作爲PHP手冊說,

的print_r - 打印有關的可變人類可讀信息3210

當我們使用json_decode();時,我們得到一個類型爲stdClass的對象作爲返回類型。 要在print_r()中傳遞的參數應該是數組或字符串。因此,我們無法傳遞print_r()中的對象。我發現了兩種方法來處理這個問題。

  1. 將對象轉換爲數組。
    這可以實現如下。

    $a = (array)$object; 
    
  2. 通過訪問對象
    正如前面提到的,當您使用json_decode();函數,它返回一個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

4

當您嘗試訪問它$result['context'],你把它當作一個陣列,它告訴你的錯誤,你是實際處理的對象,那麼你應該訪問它$result->context

0

更改它

$results->fetch_array() 
2

我得到這個錯誤出藍色的,因爲我的Facebook登錄suddently停止工作(我也變了主機)和扔這個錯誤。解決方法是很容易

的問題是在這個代碼

$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對象轉換爲數組。以下是固定代碼。

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

注意,在第一行中使用關陣列()量詞。

相關問題