Non è possibile utilizzare l'oggetto di tipo stdClass come array?


541

Ottengo uno strano errore durante l'utilizzo json_decode(). Decodifica correttamente i dati (l'ho visto usando print_r), ma quando provo ad accedere alle informazioni all'interno dell'array ottengo:

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

Ho solo provato a fare: da $result['context']dove $resultsono tornati i datijson_decode()

Come posso leggere i valori all'interno di questo array?


15
$ result = json_decode ('the string', true); L'aggiunta del vero restituisce il risultato come un array e non come una stdClass.
Nepaluz,

Risposte:


790

Utilizzare il secondo parametro di json_decodeper farlo restituire un array:

$result = json_decode($data, true);

209

La funzione json_decode()restituisce un oggetto per impostazione predefinita.

Puoi accedere ai dati in questo modo:

var_dump($result->context);

Se hai identificatori come from-date(il trattino causerebbe un errore PHP quando usi il metodo sopra) devi scrivere:

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

Se vuoi un array puoi fare qualcosa del genere:

$result = json_decode($json, true);

O cast l'oggetto su un array:

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

2
mi ci è voluto un po 'per trovarlo quando cercavo di trovare un modo per fare riferimento al valore _destroy in php impostato da knockoutjs, quindi +1
deltree

2
Questa risposta è molto più qualificata della prima (la più votata)!
Mojtaba Rezaeian,

149

È necessario accedervi utilizzando ->poiché è un oggetto.

Cambia il tuo codice da:

$result['context'];

Per:

$result->context;

Il problema che ho è provare a utilizzare la proprietà in modo condizionale if ($result->context = $var) Ciò causa l'impostazione della proprietà sul var e restituisce true, non importa.
STWilson,

3
@STWilson dovresti usare un doppio uguale ==, nel tuo stato attuale stai assegnando $varvalore $result->contextusando un singolo uguale =. E lo if statementleggerà come se fosse vuoto o meno, e se il $varvalore ha allora significa che non è vuoto e restituirà sempre vero.
JiNexus,

89

Hanno lo stesso problema oggi, risolto in questo modo:

Se chiami json_decode($somestring)otterrai un Oggetto e dovrai accedere a Mi piace $object->key, ma se chiami json_decode($somestring, true)otterrai un dizionario e puoi accedere a Mi piace$array['key']


2
Questo mi ha fatto risparmiare moltissimo tempo! Non stavo inserendo il parametro vero e provando ad accedervi come un array
Meeyam,

87

Utilizzare truecome secondo parametro per json_decode. Questo decodificherà il json in un array associativo anziché in stdObjectistanze:

$my_array = json_decode($my_json, true);

Vedi la documentazione per maggiori dettagli.



28

Come dice il manuale di Php ,

print_r - Stampa informazioni leggibili dall'uomo su una variabile

Quando usiamo json_decode();, otteniamo un oggetto di tipo stdClass come tipo restituito. Gli argomenti, che devono essere passati all'interno di, print_r()dovrebbero essere una matrice o una stringa. Quindi, non possiamo passare un oggetto all'interno di print_r(). Ho trovato 2 modi per affrontarlo.

  1. Trasmetti l'oggetto all'array.
    Ciò può essere ottenuto come segue.

    $a = (array)$object;
  2. Accedendo alla chiave dell'oggetto
    Come accennato in precedenza, quando si utilizza la json_decode();funzione, restituisce un oggetto di stdClass. puoi accedere agli elementi dell'oggetto con l'aiuto di ->Operator.

    $value = $object->key;

Uno, può anche usare più chiavi per estrarre gli elementi secondari in caso se l'oggetto ha matrici nidificate.

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

Ci sono anche altre opzioni per print_r(), come var_dump();evar_export();

PS : Inoltre, se imposti il ​​secondo parametro di json_decode();a true, convertirà automaticamente l'oggetto in un array();
Ecco alcuni riferimenti:
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


12

Per ottenere un array come risultato da una stringa JSON è necessario impostare il secondo parametro come booleano true.

$result = json_decode($json_string, true);
$context = $result['context'];

Altrimenti $ risultato sarà un oggetto std. ma puoi accedere ai valori come oggetto.

  $result = json_decode($json_string);
 $context = $result->context;


8

Quando provi ad accedervi come $result['context'], lo tratti come un array, l'errore ti dice che stai effettivamente trattando un oggetto, quindi dovresti accedervi come$result->context


4

Ecco la firma della funzione:

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

Quando param è falso, che è di default, restituirà un tipo php appropriato. Ottieni il valore di quel tipo usando il paradigma object.method.

Quando param è vero, restituirà array associativi.

Restituirà NULL in caso di errore.

Se si desidera recuperare il valore tramite l'array, impostare assoc su true.


3

A volte quando si lavora con API si desidera semplicemente mantenere un oggetto un oggetto. Per accedere all'oggetto che ha oggetti nidificati è possibile effettuare le seguenti operazioni:

Assumeremo quando stampi_r l'oggetto che potresti vedere:

print_r($response);

stdClass object
(
    [status] => success
    [message] => Some message from the data
    [0] => stdClass object
        (
            [first] => Robert
            [last] => Saylor
            [title] => Symfony Developer
        )
    [1] => stdClass object
        (
            [country] => USA
        )
)

Per accedere alla prima parte dell'oggetto:

print $response->{'status'};

E questo produrrebbe "successo"

Ora chiave le altre parti:

$first = $response->{0}->{'first'};
print "First name: {$first}<br>";

L'output previsto sarebbe "Robert" con un'interruzione di riga.

Puoi anche riassegnare parte dell'oggetto a un altro oggetto.

$contact = $response->{0};
print "First Name: " . $contact->{'first'} . "<br>";

L'output previsto sarebbe "Robert" con un'interruzione di riga.

Per accedere alla chiave successiva "1" il processo è lo stesso.

print "Country: " . $response->{1}->{'country'} . "<br>";

Il risultato atteso sarebbe "USA"

Speriamo che questo ti aiuti a capire gli oggetti e perché vogliamo mantenere un oggetto un oggetto. Non è necessario convertire un oggetto in un array per accedere alle sue proprietà.


2

invece di usare le parentesi quadre usare l'operatore oggetto per esempio il mio array basato sull'oggetto database viene creato in questo modo in una classe chiamata 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;
}

}

per accedere alle informazioni che utilizzo questo codice sullo script del controller:

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



?>

quindi per visualizzare le informazioni che controllo per vedere se le chiamate di servizio sono state impostate e ha un conteggio maggiore di 0 ricordare che non è un array a cui mi riferisco, quindi accedo ai record con l'operatore oggetto "->" in questo modo:

<?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="https://stackoverflow.com/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'; ?>

2

Ho avuto questo errore di punto in bianco perché il mio accesso a Facebook ha smesso improvvisamente di funzionare (avevo anche cambiato host) e ho lanciato questo errore. La correzione è davvero semplice

Il problema era in questo codice

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

Fondamentalmente la funzione isset () prevede un array ma trova invece un oggetto. La soluzione semplice è convertire l'oggetto PHP in array usando il quantificatore (array) . Di seguito è riportato il codice fisso.

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

Notare il quantificatore use off array () nella prima riga.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.