2011-07-25 15 views
359

Otrzymuję dziwny błąd przy użyciu json_decode(). To dekodować prawidłowo dane (widziałem go przy użyciu print_r), ale gdy próbuję uzyskać dostęp do informacji wewnątrz tablicy uzyskać:Nie można użyć obiektu typu stdClass jako tablicy?

Fatal error: Cannot use object of type stdClass as array in 
C:\Users\Dail\software\abs.php on line 108 

ja tylko próbowałem zrobić: $result['context'] gdzie $result ma dane zwracane przez json_decode()

Jak mogę odczytać wartości z tej tablicy?

+8

$ result = json_decode ('ciąg znaków', prawda); Dodanie wartości true powoduje zwrócenie wyniku jako tablicy, a nie stdClass. – Nepaluz

Odpowiedz

41

To nie jest tablica, to obiekt typu stdClass.

Możesz go tak:

echo $oResult->context; 

Więcej informacji: What is stdClass in PHP?

61

Korzystając true jako drugi parametr json_decode. To dekodowania JSON w tablicy asocjacyjnej zamiast stdObject przypadkach:

$my_array = json_decode($my_json, true); 

Zobacz the documentation więcej szczegółów.

565

pomocą drugiego parametru json_decode aby powrócić macierz:

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

Funkcją json_decode() zwraca obiekt domyślnie.

można uzyskać dostęp do danych tak:

var_dump($result->context); 

Jeśli masz identyfikatory jak from-date (myślnik spowodowałoby błąd PHP przy użyciu powyższej metody), musisz napisać:

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

Jeśli chcesz tablicę można zrobić coś takiego:

$result = json_decode($json, true); 

O r oddania obiektu do tablicy:

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

zabrał mi trochę czasu, aby znaleźć to, próbując znaleźć sposób na odniesienie się do wartości _destroy w php ustawionej przez knockoutjs, więc +1 – deltree

2

zamiast używania wsporniki użyć operatora obiektu na przykład moja tablica na podstawie obiektu bazy danych jest tworzony tak w klasie zwanej 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; 
} 

} 

do dostęp do informacji używam tego kodu w skrypcie kontroler:

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



?> 

następnie, aby wyświetlić informacje i sprawdzić, czy servicecalls został ustawiony i ma liczbę większą niż 0 rememb er nie jest tablicą ja przedstawieniu więc dostęp do rekordów z operatorem obiektu „->” tak:

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

Musisz do niego dostęp za pomocą -> od jego przedmiotu.

Zmień swój kod:

$result['context']; 

Do:

$result->context; 
+0

Problem jaki mam, to próba użycia właściwości w warunkowym 'if ($ result- > context = $ var) 'To powoduje, że właściwość ma być ustawiona na var i zwraca true, bez względu na to. – STWilson

+1

@STWilson powinieneś używać double równa się '==', w twoim obecnym stanie przypisujesz wartość '$ var' do' $ result-> context' używając jednego równego '='. A instrukcja "if" odczyta ją tak, jakby była pusta lub nie, a jeśli '$ var' ma wartość, oznacza to, że nie jest pusta i zawsze zwróci true. – Jimvirle

+0

Dzięki! To powinno być oznaczone jako poprawna odpowiedź ... – Roberto

6

można konwertować obiekt klasy stdClass do tablicy jak:

$array = (array)$stdClass; 

stdClsss to array

4

Oto f podpis sygnatury:

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

Gdy parametr jest fałszywy, co jest domyślne, zwróci odpowiedni typ php. Pobieramy wartość tego typu za pomocą paradygmatu object.method.

Gdy parametr jest prawdziwy, zwróci tablice asocjacyjne.

Zwróci wartość NULL w przypadku błędu.

Jeśli chcesz pobrać wartość z tablicy, ustaw assoc na wartość true.

31

Mają ten sam problem dzisiaj rozwiązany tak:

Jeśli zadzwonisz json_decode($somestring) dostaniesz obiekt i trzeba przejść jak $object->key, ale jeśli u zadzwonić json_decode($somestring, true) dostaniesz słownika i ma dostęp jak $array['key']

18

Jak PHP Manual powiedzieć,

print_r - Drukuje ludzkiej postaci czytelnej informacji o zmiennej

Kiedy używamy json_decode();, otrzymujemy obiekt typu stdClass jako typ zwracany. Argumenty, które należy przekazać wewnątrz print_r(), powinny być tablicą lub łańcuchem. Dlatego nie możemy przekazać obiektu wewnątrz print_r(). Znalazłem 2 sposoby radzenia sobie z tym.

  1. Prześlij obiekt do tablicy.
    Można to osiągnąć w następujący sposób.

    $a = (array)$object; 
    
  2. Wchodząc klucz Obiektu
    Jak wspomniano wcześniej, podczas korzystania json_decode(); funkcji, zwraca obiekt stdClass. możesz uzyskać dostęp do elementów obiektu za pomocą operatora ->.

    $value = $object->key; 
    

Jeden, można również użyć kilku klawiszy wyodrębnić elementy podrzędne okrywać jeśli obiekt jest zagnieżdżone tablice.

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

Ich są inne opcje do print_r() jak dobrze, jak var_dump(); i var_export();

PS: Także, jeśli ustawić drugi parametr json_decode(); do true, zostanie ona automatycznie konwertować obiekt do array();
Oto niektóre odniesienia:
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

Podczas próby uzyskania dostępu do jej jako $result['context'], to traktując go jako tablicę, błąd to z informacją, że w rzeczywistości do czynienia z obiektem, a następnie należy go otworzyć za $result->context

0

Zmień go na

$results->fetch_array() 
2

mam ten błąd znikąd ponieważ mój facebook logowanie suddently przestał działać (ja również zmienić hosty) i throwed ten błąd. Rozwiązaniem jest naprawdę łatwe

Problem był w tym kodzie

funkcja
$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']); 
    } 

Zasadniczo isset() oczekiwać tablicę ale zamiast tego znaleźć obiekt. Prostym rozwiązaniem jest przekonwertowanie obiektu PHP na tablicę przy użyciu kwantyfikatora (tablica). Poniżej znajduje się poprawiony kod.

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

Zanotuj kwantyfikator use array() w pierwszym wierszu.

Powiązane problemy