Kan object van het type stdClass niet als array gebruiken?

Ik krijg een vreemde foutmelding bij het gebruik van json_decode(). Het decodeert de gegevens correct (ik zag het met print_r), maar als ik probeer toegang te krijgen tot informatie in de array, krijg ik:

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

Ik heb alleen geprobeerd het volgende te doen: $result['context']waarbij $resultde gegevens heeft geretourneerd door json_decode()

Hoe kan ik waarden in deze array lezen?


Antwoord 1, autoriteit 100%

Gebruik de tweede parameter van json_decodeom het een array te laten retourneren:

$result = json_decode($data, true);

Antwoord 2, autoriteit 26%

De functie json_decode()retourneert standaard een object.

Je hebt als volgt toegang tot de gegevens:

var_dump($result->context);

Als je identifiers hebt zoals from-date(het koppelteken zou een PHP-fout veroorzaken bij gebruik van de bovenstaande methode), moet je schrijven:

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

Als je een array wilt, kun je zoiets als dit doen:

$result = json_decode($json, true);

Of cast het object naar een array:

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

Antwoord 3, autoriteit 19%

Je moet het openen met ->aangezien het een object is.

Wijzig uw code van:

$result['context'];

Aan:

$result->context;

Antwoord 4, autoriteit 11%

Gebruik trueals de tweede parameter voor json_decode. Hierdoor wordt de json gedecodeerd in een associatieve array in plaats van stdObject-instanties:

$my_array = json_decode($my_json, true);

Zie de documentatievoor meer details.


Antwoord 5, autoriteit 11%

Heb vandaag hetzelfde probleem, als volgt opgelost:

Als je json_decode($somestring)aanroept, krijg je een Object en moet je toegang krijgen zoals $object->key, maar als je json_decode($somestring, true)je krijgt een woordenboek en hebt toegang zoals $array['key']


Antwoord 6, autoriteit 8%

Het is geen array, het is een object van het type stdClass.

Je kunt het als volgt openen:

echo $oResult->context;

Meer info hier: Wat is stdClass in PHP?


Antwoord 7, autoriteit 3%

Zoals de Php-handleidingzegt:

print_r Drukt voor mensen leesbare informatie over een variabele af

Als we json_decode();gebruiken, krijgen we een object van het type stdClass als retourtype.
De argumenten die binnen print_r()moeten worden doorgegeven, moeten een array of een tekenreeks zijn. Daarom kunnen we geen object binnen print_r()doorgeven. Ik heb 2 manieren gevonden om hiermee om te gaan.

  1. Creëer het object naar een array.
    Dit kan als volgt worden bereikt.

    $a = (array)$object;
    
  2. Door toegang te krijgen tot de sleutel van het object
    Zoals eerder vermeld, retourneert het een object van stdClass wanneer u de functie json_decode();gebruikt. je hebt toegang tot de elementen van het object met behulp van de ->Operator.

    $value = $object->key;
    

Eén, kan ook meerdere sleutels gebruiken om de subelementen te extraheren als het object geneste arrays heeft.

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

Er zijn ook andere opties voor print_r(), zoals var_dump();en var_export();

PS: Als u de tweede parameter van de json_decode();instelt op true, wordt het object automatisch geconverteerd naar een array();
Hier zijn enkele referenties:
http://php.net/manual/en/function.print-r.php< br>
http://php.net/manual/en/function.var-dump.php< br>
http://php.net/manual/en/function.var-export.php


Antwoord 8, autoriteit 3%

Om een ​​array als resultaat van een json-tekenreeks te krijgen, moet u de tweede parameter instellen op boolean true.

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

Anders wordt $result een std object. maar je hebt toegang tot waarden als object.

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

Antwoord 9, autoriteit 2%

Soms als je met API werkt, wil je een object gewoon een object houden. Om toegang te krijgen tot het object dat geneste objecten heeft, kunt u het volgende doen:

We gaan ervan uit dat wanneer u het object afdrukt, u dit zou kunnen zien:

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

Om toegang te krijgen tot het eerste deel van het object:

print $response->{'status'};

En dat zou “succes” opleveren

Laten we nu de andere delen intoetsen:

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

De verwachte uitvoer zou “Robert” zijn met een regeleinde.

U kunt ook een deel van het object opnieuw toewijzen aan een ander object.

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

De verwachte uitvoer zou “Robert” zijn met een regeleinde.

Voor toegang tot de volgende toets “1” is het proces hetzelfde.

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

De verwachte output zou “VS” zijn

Hopelijk helpt dit je objecten te begrijpen en waarom we een object een object willen houden. U hoeft een object niet naar een array te converteren om toegang te krijgen tot de eigenschappen ervan.


Antwoord 10

Probeer zoiets als dit!

In plaats van de context te krijgen zoals:(dit werkt voor het verkrijgen van array-indexen)

$result['context']

probeer (dit werk voor het verkrijgen van objecten)

$result->context

Ander voorbeeld is: (als $resultmeerdere gegevenswaarden heeft)

Array
(
    [0] => stdClass Object
        (
            [id] => 15
            [name] => 1 Pc Meal
            [context] => 5
            [restaurant_id] => 2
            [items] => 
            [details] => 1 Thigh (or 2 Drums) along with Taters
            [nutrition_fact] => {"":""}
            [servings] => menu
            [availability] => 1
            [has_discount] => {"menu":0}
            [price] => {"menu":"8.03"}
            [discounted_price] => {"menu":""}
            [thumbnail] => YPenWSkFZm2BrJT4637o.jpg
            [slug] => 1-pc-meal
            [created_at] => 1612290600
            [updated_at] => 1612463400
        )
)

Probeer dan dit:

foreach($result as $results)
{
      $results->context;
}

Antwoord 11

U kunt het stdClass-object naar een array converteren zoals:

$array = (array)$stdClass;

stdClsss naar array


Antwoord 12

Als je het probeert te openen als $result['context'], behandel je het als een array, de fout die het je vertelt dat je daadwerkelijk met een object te maken hebt, dan zou je toegang moeten krijgen het als $result->context


Antwoord 13

Hier is de functiehandtekening:

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

Als param false is, wat standaard is, wordt een geschikt php-type geretourneerd. Je haalt de waarde van dat type op met behulp van het object.method-paradigma.

Als param waar is, zal het associatieve arrays retourneren.

Het zal NULL retourneren bij een fout.

Als u waarde via array wilt ophalen, stelt u assoc in op true.


Antwoord 14

Ik kreeg deze fout uit het niets omdat mijn Facebook-login plotseling niet meer werkte (ik was ook van host veranderd) en deze fout veroorzaakte. De oplossing is heel eenvoudig

Het probleem zat in deze 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']);
  }

In principe verwacht de functie isset() een array, maar vindt in plaats daarvan een object. De eenvoudige oplossing is om het PHP-object naar een array te converteren met behulp van de (array)-kwantificator. Het volgende is de vaste code.

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

Let op het gebruik off array() quantifier in de eerste regel.


Antwoord 15

gebruik in plaats van de haakjes de objectoperator, bijvoorbeeld mijn array op basis van een databaseobject wordt als volgt gemaakt in een klasse met de naam 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;
}
}

voor toegang tot de informatie gebruik ik deze code in het controllerscript:

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

vervolgens om de informatie weer te geven die ik controleer om te zien of servicecalls zijn ingesteld en een telling heeft groter dan 0 onthoud dat het geen array is waarnaar ik verwijs, dus ik open de records met de objectoperator “->” zoals dit:

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

Antwoord 16

Wijzig het voor

$results->fetch_array()

Other episodes