it-swarm.com.de

Kann Objekt vom Typ stdClass nicht als Array verwenden?

Ich erhalte einen seltsamen Fehler bei der Verwendung von json_decode(). Es dekodiert die Daten korrekt (ich habe sie mit print_r gesehen), aber wenn ich versuche, auf Informationen innerhalb des Arrays zuzugreifen, erhalte ich:

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

Ich habe nur versucht: $result['context'] wobei $result die Daten von json_decode() zurückgegeben hat

Wie kann ich Werte in diesem Array lesen?

480
Dail

Verwenden Sie den zweiten Parameter von json_decode , um ein Array zurückzugeben:

_$result = json_decode($data, true);
_
714
Jon

Die Funktion json_decode() gibt standardmäßig ein Objekt zurück.

Sie können folgendermaßen auf die Daten zugreifen:

var_dump($result->context);

Wenn Sie Bezeichner wie from-date haben (der Bindestrich würde bei Verwendung der obigen Methode einen PHP -Fehler verursachen), müssen Sie Folgendes schreiben:

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

Wenn Sie ein Array möchten, können Sie Folgendes tun:

$result = json_decode($json, true);

Oder wandeln Sie das Objekt in ein Array um:

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

Sie müssen mit -> darauf zugreifen, da es ein Objekt ist.

Ändern Sie Ihren Code von:

_$result['context'];
_

Zu:

_$result->context;
_
130
JiNexus

Verwenden Sie true als zweiten Parameter für json_decode. Dies dekodiert den json in ein assoziatives Array anstelle von stdObject Instanzen:

$my_array = json_decode($my_json, true);

Siehe die Dokumentation für weitere Details.

82
Sander Marechal

Habe das gleiche Problem heute so gelöst:

Wenn Sie json_decode($somestring) aufrufen, erhalten Sie ein Objekt und müssen wie $object->key zugreifen. Wenn Sie jedoch json_decode($somestring, true) aufrufen, erhalten Sie ein Wörterbuch und können wie $array['key'] zugreifen.

78
Alexey Lysenko

Es ist kein Array, sondern ein Objekt vom Typ stdClass.

Sie können darauf folgendermaßen zugreifen:

echo $oResult->context;

Weitere Informationen hier: Was ist stdClass in PHP?

58

Wie das PHP-Handbuch sagt,

print_r - Gibt lesbare Informationen zu einer Variablen aus

Wenn wir json_decode(); verwenden, erhalten wir als Rückgabetyp ein Objekt vom Typ stdClass. Die Argumente, die innerhalb von print_r() übergeben werden sollen, sollten entweder ein Array oder eine Zeichenfolge sein. Daher können wir kein Objekt innerhalb von print_r() übergeben. Ich habe zwei Möglichkeiten gefunden, damit umzugehen.

  1. Das Objekt in ein Array umwandeln.
    Dies kann wie folgt erreicht werden.

    $a = (array)$object;
    
  2. Durch Zugriff auf den Schlüssel des Objekts
    Wie bereits erwähnt, wird bei Verwendung der Funktion json_decode(); ein Objekt der Klasse stdClass zurückgegeben. Sie können mit Hilfe des Operators -> auf die Elemente des Objekts zugreifen.

    $value = $object->key;
    

Erstens können Sie auch mehrere Schlüssel verwenden, um die Unterelemente zu extrahieren, falls das Objekt verschachtelte Arrays enthält.

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

Es gibt auch andere Optionen für print_r(), wie var_dump(); und var_export();

P.S : Wenn Sie den zweiten Parameter der json_decode(); auf true setzen, wird das Objekt automatisch in eine array(); konvertiert.
Hier einige Referenzen:
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

25
M.S.P

Sie können stdClass-Objekte wie folgt in Arrays konvertieren:

$array = (array)$stdClass;

stdClsss zum Array

7
Arnab

Wenn Sie versuchen, als $result['context'] darauf zuzugreifen, behandeln Sie es als Array. Der Fehler besagt, dass es sich tatsächlich um ein Objekt handelt, und Sie sollten als $result->context darauf zugreifen.

6
Midas Mtileni

Hier ist die Funktionssignatur:

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

Wenn param false ist (Standardeinstellung), wird ein geeigneter PHP-Typ zurückgegeben. Sie rufen den Wert dieses Typs mit dem Paradigma object.method ab.

Wenn param wahr ist, werden assoziative Arrays zurückgegeben.

Bei einem Fehler wird NULL zurückgegeben.

Wenn Sie einen Wert über ein Array abrufen möchten, setzen Sie assoc auf true.

4
robert

verwenden Sie anstelle der Klammern den Objektoperator. Mein auf dem Datenbankobjekt basierendes Array wird beispielsweise folgendermaßen in einer Klasse namens DB erstellt:

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

}

um auf die Informationen zuzugreifen, verwende ich diesen Code im Controller-Skript:

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



?>

um dann die Informationen anzuzeigen, die ich überprüfe, um festzustellen, ob Serviceabrufe festgelegt wurden und eine Anzahl von mehr als 0 aufweisen, muss daran gedacht werden, dass es sich nicht um ein Array handelt, auf das ich verweise.

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

Ich bekam diesen Fehler aus heiterem Himmel, weil mein Facebook-Login plötzlich nicht mehr funktionierte (ich hatte auch die Hosts gewechselt) und diesen Fehler auslöste. Das Update ist wirklich einfach

Das Problem lag in diesem Code

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

Grundsätzlich erwartet isset () ein Array, findet aber stattdessen ein Objekt. Die einfache Lösung besteht darin, das Objekt PHP mit (array) quantifier in ein Array umzuwandeln. Das Folgende ist der feste Code.

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

Beachten Sie den Quantifizierer use off array () in der ersten Zeile.

2
Hammad Khan

Ändern Sie es für

$results->fetch_array()
1
Dan Padilla