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?

71voto

Wesley van Opdorp Punkte 14770

Es handelt sich nicht um ein Array, sondern um ein Objekt vom Typ stdClass.

Sie können sie wie folgt aufrufen:

echo $oResult->context;

Mehr Informationen hier: Was ist stdClass in PHP?

31voto

Panda Punkte 2332

Da die Php-Handbuch sagen,

print_r - Druckt menschenlesbare Informationen über eine Variable

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

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

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

    $value = $object->key;

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

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

Es gibt andere Möglichkeiten print_r() auch, wie var_dump(); y var_export();

P.S. : Auch wenn Sie den zweiten Parameter der Option json_decode(); à true konvertiert es das Objekt automatisch in ein 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

28voto

codelone Punkte 403

Versuchen Sie etwas wie das hier!

Anstatt den Kontext zu erhalten, wie: (dies funktioniert, um Array-Indizes zu erhalten)

$result['context']

intente (dies funktioniert, um Objekte zu erhalten)

$result->context

Ein anderes Beispiel ist: (wenn $result mehrere Datenwerte hat)

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
        )

)

Dann versuchen Sie dies:

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

24voto

infomasud Punkte 1025

Um ein Array als Ergebnis aus einem Json-String zu erhalten, sollten Sie den zweiten Parameter als boolean true setzen.

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

Andernfalls wird $result ein std-Objekt sein, aber Sie können auf die Werte als Objekt zugreifen.

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

20voto

Robert Saylor Punkte 1049

Manchmal möchte man bei der Arbeit mit API einfach ein Objekt als Objekt behalten. Um auf ein Objekt zuzugreifen, das verschachtelte Objekte enthält, können Sie wie folgt vorgehen:

Wir gehen davon aus, dass Sie dies sehen, wenn Sie das Objekt drucken:

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

Um auf den ersten Teil des Objekts zuzugreifen:

print $response->{'status'};

Und das würde "Erfolg" ergeben

Lassen Sie uns nun die anderen Teile eingeben:

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

Die erwartete Ausgabe wäre "Robert" mit einem Zeilenumbruch.

Sie können auch einen Teil des Objekts einem anderen Objekt neu zuordnen.

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

Die erwartete Ausgabe wäre "Robert" mit einem Zeilenumbruch.

Für den Zugriff auf die nächste Taste "1" ist der Vorgang derselbe.

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

Die erwartete Ausgabe wäre "USA".

Ich hoffe, dies hilft Ihnen, Objekte zu verstehen und zu verstehen, warum wir ein Objekt als Objekt behalten wollen. Sie sollten ein Objekt nicht in ein Array umwandeln müssen, um auf seine Eigenschaften zuzugreifen.

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