Wie der Zugriff auf Objekt-Eigenschaften, die mit Namen wie Ganzzahlen?
Wie der Zugriff auf ein PHP-Objekt-Eigenschaft, dessen Ausgabe:
[highlighting] => stdClass Object
(
[448364] => stdClass Object
(
[Data] => Array
(
[0] => Tax amount liability is .......
Ich für den Zugriff auf den string-Wert in der key [0]. Ich möchte etwas machen wie:
print myVar->highlighting->448364->Data->0
Aber die zwei Ziffern/Ganzzahlen es scheint ein problem zu sein.
EDIT:
Gebe ich ein wenig Geschichte hier, von wo bekomme ich myVar. Ich bin mit json_decode()
etwas wie:
$myVar = json_decode(url)
verwenden Sie {} um die Ziffern.
möglich, Duplikat der Wie kann ich den Zugriff auf ein Objekt-Attribut beginnt mit einer Zahl?
Ich habe auch die Einfuhr (Gvde), doch es stellt sich heraus, es ist kein dupe: es macht den Unterschied, wenn der name der Eigenschaft beginnt mit einer Zahl oder alle zahlen!
Mmmh, interessant... sollte einen test vor, denke ich. Vielen Dank, dass mich wissen!
möglich, Duplikat der Wie kann ich den Zugriff auf ein Objekt-Attribut beginnt mit einer Zahl?
Ich habe auch die Einfuhr (Gvde), doch es stellt sich heraus, es ist kein dupe: es macht den Unterschied, wenn der name der Eigenschaft beginnt mit einer Zahl oder alle zahlen!
Mmmh, interessant... sollte einen test vor, denke ich. Vielen Dank, dass mich wissen!
InformationsquelleAutor avinash shah | 2012-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aktualisierung für PHP-7.2
PHP 7.2 eingeführt, eine Verhaltensänderung zu konvertieren von numerischen Schlüssel in Objekt-und array-CASTET, welches dies behebt insbesondere Inkonsistenz und macht alle folgenden Beispiele Verhalten sich wie erwartet.
Eine Sache weniger verwechselt werden!
Ursprüngliche Antwort (gilt für Versionen früher als 7.2.0)
PHP hat seinen Anteil an dunklen Gassen, die Sie wirklich nicht wollen, finden sich im inneren. Objekt-Eigenschaften, die mit Namen, Nummern, ist einer von Ihnen...
, Was Sie nie gesagt, Sie
Fakt #1: Sie keinen Zugriff auf Eigenschaften mit Namen, die nicht legal sind Variablennamen leicht
Fact #2: Sie kann Zugriff auf solche Eigenschaften mit geschweiften Klammern syntax
Fakt #3: Aber nicht wenn der name der Eigenschaft ist alle Ziffern!
Live Beispiel.
Fakt #4: Gut, sofern das Objekt nicht aus einem array in den ersten Platz.
Live Beispiel.
Ziemlich intuitiv, meinst du nicht?
, Was Sie tun können,
Option #1: es manuell tun
Den meisten praktischen Ansatz ist es einfach zu werfen das Objekt, das Sie interessiert sind, zurück in ein array, die Ihnen erlauben, den Zugriff auf die Eigenschaften:
Leider funktioniert das nicht rekursiv. Also in Ihrem Fall Sie 'd müssen etwas tun wie:
Option #2: die nukleare option
Ein alternativer Ansatz wäre eine Funktion schreiben, die konvertiert Objekte, arrays rekursiv:
Aber ich 'm nicht davon überzeugt, dass dies eine bessere option über das board, weil es unnötig gegossen, um arrays, die alle die Eigenschaften, die Sie nicht interessiert, als auch diejenigen, die Sie sind.
Option #3: spielen Sie clever
Alternative der vorherigen option ist die Verwendung der eingebaute JSON-Funktionen:
Den JSON-Funktionen hilfsbereit, führen Sie eine rekursive Umwandlung zu array, ohne die Notwendigkeit zu definieren, externe Funktionen. So wünschenswert dies sieht, ist es das "nuke" Nachteil von option #2 und zusätzlich den Nachteil, dass, wenn es irgendwelche Zeichenfolgen, die in Ihrem Objekt, werden diese Zeichenfolgen muss werden codiert in UTF-8 (dies ist eine Anforderung von
, die Funktionen json_encode
).Jon, vielen Dank für meine Rettung. Mein problem war anders, aber (ich denke, es ist wirklich in "was Sie nie erzählte Sie" Teil). Das DateTime-Objekt abgerufen aus DB scheint OK, aber wenn ich auf irgendeine seiner Eigenschaften, wie
->date
oder->timezone
nurnull
zurückgegeben. Ich habe bemerkt, dass wenn ich var_dumped das Objekt vor der Verwendung dieser Eigenschaften die richtigen Werte zurückgegeben. Klonen nicht dieses Problem beheben, so dass ich denke, es hat wirklich etwas damit zu tun, dass der Zugangvar_dump
tut... Dann sah ich Ihre Option #1 und voilá, der Zugriff als array ($objCastAsArray['date']
) arbeitete wie ein Charme.Fakt #0: Casting-arrays in Objekte sollten nicht keine stinkenden Sinn in den ersten Platz. Fact #1-Fakt #3: nicht benötigte.
Ich Stimme zu, dass es etwas fraglich, aber es kann ganz sinnvoll in manchen Situationen. Auf jeden Fall, denn es ist dokumentiert in der Anleitung zu arbeiten, wie diese, unsere persönlichen Meinungen, die nicht wirklich wichtig sind.
ich schrieb ein ticket im php-bugtracker: bugs.php.net/bug.php?id=70127
InformationsquelleAutor Jon
Wollte nur hinzufügen, Jon s beredte Erklärung der Grund, warum dies nicht gelingt. Es ist alles, weil beim erstellen eines array, php wandelt Schlüssel zu ganzen zahlen — wenn er kann — die Ursachen-lookup-Probleme auf arrays, die sind gegossen worden, Objekte, einfach, weil der numerische Schlüssel ist erhalten. Dies ist problematisch, weil alle Eigentums-und access-Optionen erwarten oder konvertieren in strings. Sie können dies überprüfen, indem Sie Folgendes tun:
Denen ausgeben würde:
So hat das Objekt zwei Eigenschaften Tasten, numerisch (die kann nicht zugegriffen werden) und einer Zeichenfolge basiert. Dies ist der Grund, warum Jon
#Fact 4
funktioniert, weil durch das setzen der Eigenschaft mit geschweiften Klammern bedeutet, dass Sie immer definieren Sie eine string-basierte Schlüssel, sondern als numerische.Einnahme von Jon ' s Lösung, aber drehen es auf den Kopf, erzeugen Sie ein Objekt aus dem array, dass es immer string-basierte Schlüssel, indem Sie Folgendes tun:
Ab jetzt können Sie verwenden Sie eine der folgenden, da der Zugang auf diese Weise wandelt immer der Wert innerhalb der geschweiften Klammer einen string:
Guten alten unlogisch PHP...
InformationsquelleAutor Pebbl
Ich kopiert hatte, diese Funktion aus dem Netz. Wenn es arbeitet, wie er sagt ("die Funktion zum Konvertieren stdClass-Objekten, Mehrdimensionale Arrays"), versuchen Sie Folgendes:
objectToArray
Funktion[highlighting][448364][Data][0]
Quelle: PHP stdClass Array und Array stdClass
InformationsquelleAutor Ruwantha
Letzte alternative zu Jon ' s umfassender Antwort:
Verwenden Sie einfach json_decode() mit dem zweiten parameter festgelegt wahr.
Diese gibt dann ein assoziatives array, anstatt ein Objekt, so dass keine Notwendigkeit, zu konvertieren, nach der Tat.
Diese möglicherweise nicht geeignet für jede Anwendung, aber es hat mir wirklich geholfen, einfach Referenz ist eine Eigenschaft der oroginal-Objekt.
Lösung gefunden wurde, die in diesem tutorial - http://nitschinger.at/Handling-JSON-like-a-boss-in-PHP/
Hinsichtlich
InformationsquelleAutor Bluekable
Ich fürchte, Sie dürfen nicht den Namen von Objekten, beginnend mit der Numerik. Benennen Sie die erste "448364", beginnend mit einem Buchstaben.
Das zweite ist ein array, diejenigen sind, auf die zugegriffen werden durch Klammern, zum Beispiel so:
statt
InformationsquelleAutor Gustav
Wenn ein Objekt beginnt mit
@
wie:Müssen Sie verwenden:
weil
$parent_object->{'@attributes'}
oder$parent_object['@attributes']
wird nicht funktionieren.InformationsquelleAutor Zydnar