Ich benutze so json_decode()
etwas wie:
$myVar = json_decode($data)
Was mir folgende Ausgabe gibt:
[highlighting] => stdClass Object
(
[448364] => stdClass Object
(
[Data] => Array
(
[0] => Tax amount liability is .......
Ich möchte auf den Zeichenfolgenwert im Schlüssel [0] zugreifen. Wenn ich versuche, etwas zu tun wie:
print $myVar->highlighting->448364->Data->0;
Ich erhalte diesen Fehler:
Analysefehler: Syntaxfehler, unerwarteter T_DNUMBER
Die zwei Ziffern / ganzen Zahlen dort scheinen ein Problem zu sein.
php
object
properties
Avinash Shah
quelle
quelle
Antworten:
Aktualisiert für PHP 7.2
PHP 7.2 führte eine Verhaltensänderung beim Konvertieren von numerischen Schlüsseln in Objekt- und Array-Casts ein , die diese besondere Inkonsistenz behebt und dafür sorgt, dass sich alle folgenden Beispiele wie erwartet verhalten.
Eine Sache weniger zu verwirren!
Ursprüngliche Antwort (gilt für Versionen vor 7.2.0)
PHP hat seinen Anteil an dunklen Gassen, in denen Sie sich wirklich nicht wiederfinden wollen. Objekteigenschaften mit Namen, die Zahlen sind, sind eine davon ...
Was sie dir nie erzählt haben
Fakt Nr. 1: Sie können nicht einfach auf Eigenschaften mit Namen zugreifen, die keine legalen Variablennamen sind
Fakt 2: Sie können auf solche Eigenschaften mit geschweifter Klammer-Syntax zugreifen
Fakt Nr. 3: Aber nicht, wenn der Eigenschaftsname nur aus Ziffern besteht!
Live Beispiel .
Fakt Nr. 4: Nun, es sei denn, das Objekt stammt überhaupt nicht aus einem Array.
Live Beispiel .
Ziemlich intuitiv, stimmst du nicht zu?
Was du tun kannst
Option 1: manuell ausführen
Der praktischste Ansatz besteht darin, das gewünschte Objekt einfach wieder in ein Array umzuwandeln, mit dem Sie auf die Eigenschaften zugreifen können:
Dies funktioniert leider nicht rekursiv. In Ihrem Fall müssten Sie also Folgendes tun:
Option 2: die nukleare Option
Ein alternativer Ansatz wäre das Schreiben einer Funktion, die Objekte rekursiv in Arrays konvertiert:
Ich bin jedoch nicht davon überzeugt, dass dies auf ganzer Linie eine bessere Option ist, da unnötigerweise alle Eigenschaften, an denen Sie nicht interessiert sind, sowie die Eigenschaften, die Sie sind, in Arrays umgewandelt werden.
Option 3: Clever spielen
Eine Alternative zur vorherigen Option ist die Verwendung der integrierten JSON-Funktionen:
Die JSON-Funktionen führen eine rekursive Konvertierung in ein Array durch, ohne dass externe Funktionen definiert werden müssen. So wünschenswert dies auch aussieht, es hat den "Nuke" -Nachteil von Option 2 und zusätzlich den Nachteil, dass, wenn sich in Ihrem Objekt Zeichenfolgen befinden, diese Zeichenfolgen in UTF-8 codiert werden müssen (dies ist eine Anforderung von
json_encode
).quelle
->date
oder->timezone
nurnull
zurückgegeben wird. Ich habe festgestellt, dass die richtigen Werte zurückgegeben werden, wenn ich das Objekt vor Verwendung dieser Eigenschaften var_dumped habe. Das Klonen behebt das nicht, also hat es wohl wirklich etwas mit dem Zugriff zu tun, der diesvar_dump
bewirkt ... Dann sah ich, dass Ihre Option Nr. 1 und voilá, als Array ($objCastAsArray['date']
) darauf zuzugreifen, wie ein Zauber funktionierten.$o = unserialize('O:8:"StdClass"' . substr(serialize($a),1));
Ich wollte nur zu Jons beredter Erklärung den Grund hinzufügen, warum dies fehlschlägt. Dies alles liegt daran, dass PHP beim Erstellen eines Arrays - wenn möglich - Schlüssel in Ganzzahlen konvertiert, was zu Suchproblemen bei Arrays führt, die in Objekte umgewandelt wurden, einfach weil der numerische Schlüssel erhalten bleibt. Dies ist problematisch, da alle Eigenschaftszugriffsoptionen Zeichenfolgen erwarten oder in Zeichenfolgen konvertieren. Sie können dies wie folgt bestätigen:
Welches würde ausgeben:
Das Objekt verfügt also über zwei Eigenschaftsschlüssel, einen numerischen (auf den nicht zugegriffen werden kann) und einen auf Zeichenfolgen basierenden. Dies ist der Grund, warum Jon
#Fact 4
arbeitet, denn wenn Sie die Eigenschaft mit geschweiften Klammern festlegen, definieren Sie immer einen auf Zeichenfolgen basierenden Schlüssel anstelle eines numerischen.Wenn Sie Jons Lösung nehmen, sie aber auf den Kopf stellen, können Sie aus Ihrem Array ein Objekt generieren, das immer stringbasierte Schlüssel enthält, indem Sie folgende Schritte ausführen:
Von nun an können Sie eine der folgenden Optionen verwenden, da der Zugriff auf diese Weise den Wert in der geschweiften Klammer immer in eine Zeichenfolge konvertiert:
Gutes altes unlogisches PHP ...
quelle
Wenn ein Objekt mit
@
like beginnt :Sie müssen verwenden:
weil
$parent_object->{'@attributes'}
oder$parent_object['@attributes']
wird nicht funktionieren.quelle
Ich hatte diese Funktion aus dem Netz kopiert. Versuchen Sie Folgendes, wenn es wie angegeben funktioniert ("Funktion zum Konvertieren von stdClass-Objekten in mehrdimensionale Arrays"):
objectToArray
funktionieren[highlighting][448364][Data][0]
Quelle: PHP stdClass to Array und Array to stdClass
quelle
Eine letzte Alternative zu Jons umfassender Antwort:
Verwenden Sie einfach json_decode (), wobei der zweite Parameter auf true gesetzt ist .
Dies gibt dann ein assoziatives Array anstelle eines Objekts zurück, sodass nachträglich keine Konvertierung erforderlich ist.
Dies ist möglicherweise nicht für jede Anwendung geeignet, hat mir jedoch wirklich geholfen, eine Eigenschaft des oroginalen Objekts leicht zu referenzieren.
Die Lösung wurde in diesem Tutorial gefunden - http://nitschinger.at/Handling-JSON-like-a-boss-in-PHP/
Grüße
quelle
Zugriff auf Objekteigenschaften mit Nummern als Eigenschaftsnamen. Wird meistens nach dem Umwandeln des Arrays in ein Objekt benötigt.
quelle
Ich fürchte, Sie dürfen keine Objekte benennen, die mit Zahlen beginnen. Benennen Sie den ersten "448364" um, beginnend mit einem Buchstaben.
Das zweite ist ein Array, auf das in Klammern wie folgt zugegriffen werden soll:
stattdessen
quelle