php json - Kann das Objekt vom Typ stdClass nicht als Array verwendet werden?





object to (12)


Anstatt die Klammern zu verwenden, benutze den Objektoperator, zum Beispiel wird mein Array basierend auf dem Datenbankobjekt in einer Klasse namens DB erzeugt:

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



?>

dann, um die Information anzuzeigen, die ich überprüfe, um zu sehen, ob servicecalls gesetzt worden ist und eine Zählung größer als 0 hat, erinnere mich, dass es nicht ein Array bin, das ich referenziere, damit ich auf die Aufzeichnungen mit dem Objektoperator "->" so zugreife:

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

Ich bekomme einen seltsamen Fehler mit json_decode() . Es dekodiert die Daten korrekt (ich sah es mit print_r ), aber wenn ich versuche, auf Informationen innerhalb des Arrays zuzugreifen, bekomme 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 von json_decode() Daten hat

Wie kann ich Werte in diesem Array lesen?




Habe heute dasselbe Problem, gelöst wie folgt:

Wenn Sie json_decode($somestring) Sie ein Objekt und Sie müssen auf $object->key , aber wenn Sie json_decode($somestring, true) Sie ein Dictionary und können auf $array['key'] zugreifen $array['key']




Ändern Sie es für

$results->fetch_array()



Wie das PHP-Handbuch sagt,

print_r - Druckt menschenlesbare Informationen über eine Variable

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

  1. Wirf das Objekt in ein Array.
    Dies kann wie folgt erreicht werden.

    $a = (array)$object;
    
  2. Durch Zugriff auf den Schlüssel des Objekts
    Wie bereits erwähnt, wenn Sie json_decode(); Funktion, gibt es ein Objekt von stdClass zurück. Sie können auf die Elemente des Objekts mit Hilfe von -> Operator zugreifen.

    $value = $object->key;
    

One, kann auch mehrere Schlüssel verwenden, um die Unterelemente zu extrahieren, wenn das Objekt verschachtelte Arrays hat.

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

Sie haben andere Optionen zu print_r() , wie var_dump(); und var_export();

PS : Wenn Sie den zweiten Parameter von json_decode(); Bei true wird das Objekt automatisch in ein array(); konvertiert array();
Hier sind 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




Ich habe diesen Fehler aus heiterem Himmel bekommen, weil mein Facebook-Login plötzlich nicht mehr funktioniert (ich habe auch die Hosts gewechselt) und diesen Fehler ausgelöst habe. Die Lösung ist wirklich einfach

Das Problem war 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 die Funktion isset () ein Array, sucht aber stattdessen ein Objekt. Die einfache Lösung besteht darin, ein PHP-Objekt mit (Array-) Quantifizierer in ein Array zu konvertieren. 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, dass der Array-Quantor () in der ersten Zeile verwendet wird.




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

Weitere Informationen finden Sie in json_decode() .




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

$result = json_decode($data, true);



Sie müssen darauf zugreifen, indem Sie -> als ein Objekt verwenden.

Ändern Sie Ihren Code von:

$result['context'];

Zu:

$result->context;



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

Sie können darauf wie folgt zugreifen:

echo $oResult->context;

Weitere Informationen finden Sie hier: Was ist stdClass in PHP?




Hier ist die Funktionssignatur:

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

Wenn param false ist, was der Standardwert ist, wird ein entsprechender php-Typ zurückgegeben. Sie rufen den Wert dieses Typs mit object.method paradigm ab.

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

Bei einem Fehler wird NULL zurückgegeben.

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




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

Sie können auf die Daten wie folgt zugreifen:

var_dump($result->context);

Wenn Sie Bezeichner wie from-date (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 wollen, können Sie so etwas tun:

$result = json_decode($json, true);

Oder wirf das Objekt auf ein Array:

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



  // our initial array  
   $arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");  
  print_r($arr);

  // remove the elements who's values are yellow or red  
   $arr = array_diff($arr, array("yellow", "red"));
  print_r($arr);  

Dies ist die Ausgabe aus dem obigen Code:

Array
(
    [0] => blue
    [1] => green
    [2] => red
    [3] => yellow
    [4] => green
    [5] => orange
    [6] => yellow
    [7] => indigo
    [8] => red
)

Array
(
    [0] => blue
    [1] => green
    [4] => green
    [5] => orange
    [7] => indigo
)

Array_values ​​() indiziert nun ein numerisches Array neu, entfernt jedoch alle Schlüsselzeichenfolgen aus dem Array und ersetzt sie durch Zahlen. Wenn Sie die Schlüsselnamen (Zeichenfolgen) beibehalten oder das Array neu indizieren müssen, wenn alle Schlüssel numerisch sind, verwenden Sie array_merge ():

$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);

Ausgänge

Array
(
    [0] => blue
    [1] => green
    [2] => green
    [3] => orange
    [4] => indigo
)




php json