701 Stimmen

Objekt vom Typ stdClass kann nicht als Array verwendet werden?

Ich erhalte einen seltsamen Fehler, wenn ich json_decode() . Es dekodiert die Daten korrekt (ich sah es mit print_r ), aber wenn ich versuche, auf die 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, es zu tun: $result['context'] donde $result hat die Daten, die von json_decode()

Wie kann ich Werte innerhalb dieses Arrays lesen?

9voto

Arnab Punkte 3583

Sie können ein stdClass-Objekt in ein Array umwandeln wie:

$array = (array)$stdClass;

stdClsss zu Array

8voto

Midas Mtileni Punkte 91

Wenn Sie versuchen, auf die Datei als $result['context'] Wenn Sie es als Array behandeln, sagt Ihnen der Fehler, dass Sie es tatsächlich mit einem Objekt zu tun haben, dann sollten Sie es als $result->context

4voto

robert Punkte 578

Hier ist die Funktionssignatur:

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

Wenn param false ist, was der Standard ist, wird ein passender php-Typ zurückgegeben. Sie können den Wert dieses Typs mit dem object.method-Paradigma abrufen.

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

Im Fehlerfall wird NULL zurückgegeben.

Wenn Sie den Wert über ein Array abrufen wollen, setzen Sie assoc auf true.

2voto

Hammad Khan Punkte 15166

Ich bekam diesen Fehler aus heiterem Himmel, weil mein Facebook-Login plötzlich nicht mehr funktionierte (ich hatte auch den Host gewechselt) und diesen Fehler auslöste. Die Lösung 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']);
  }

Im Grunde genommen erwartet die Funktion isset() ein Array, aber stattdessen findet sie ein Objekt. Die einfache Lösung ist die Umwandlung eines PHP-Objekts in ein Array mittels (Array) Quantifizierer. Der folgende Code ist feststehend.

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

Beachten Sie die Verwendung des Quantifizierers array() in der ersten Zeile.

1voto

timmac15 Punkte 59

Anstelle der Verwendung der Klammern verwenden Sie die Objekt-Operator zum Beispiel mein Array basierend auf Datenbank-Objekt wird wie folgt 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 die Informationen anzuzeigen, überprüfe ich, ob servicecalls festgelegt wurde und eine Anzahl größer als 0 hat. Denken Sie daran, dass es sich nicht um ein Array handelt, auf das ich verweise, also greife ich auf die Datensätze mit dem Objektoperator "->" wie folgt zu:

<?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="http://stackoverflow.com/servicecalls/?servicecall=' .$servicecall->ID .'">'
  .$servicecall->ServiceCallDescription .'</a>';
    }
}else echo 'No service Calls';

}

?>
<a href="http://stackoverflow.com/servicecalls/?new=true">Raise New Service Call</a>
</div> <!-- Main content end-->
<?php include $_SERVER['DOCUMENT_ROOT'] .'/includes/footer.html.php'; ?>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X