Comment accéder aux propriétés de l'objet avec des noms tels que les entiers?
Comment accéder à un objet PHP propriété dont la sortie est:
[highlighting] => stdClass Object
(
[448364] => stdClass Object
(
[Data] => Array
(
[0] => Tax amount liability is .......
Je veux accéder à la chaîne de valeur dans la clé [0]. Je veux faire quelque chose comme:
print myVar->highlighting->448364->Data->0
Mais les deux chiffres/nombres entiers il semble y avoir de problème.
EDIT:
Je vais donner un peu d'histoire ici, d'où puis-je obtenir myVar. Je suis à l'aide de json_decode()
quelque chose comme:
$myVar = json_decode(url)
- double possible de Comment puis-je accéder à un attribut de l'objet qui commence par un nombre?
- J'ai aussi Dvce), mais il s'avère en fait qu'il n'est pas dupe: il fait une différence si le nom de la propriété commence par un nombre ou tous les numéros!
- Hum, intéressant... doit avoir fait un test avant, je suppose. Merci de me le faire savoir!
Vous devez vous connecter pour publier un commentaire.
Mise à jour de PHP 7.2
PHP 7.2 introduit un changement de comportement à la conversion des touches numériques dans l'objet et de la matrice de jette, qui fixe cette incohérence et rend tous les exemples suivants se comportent comme prévu.
Une chose de moins à être confus au sujet!
Réponse originale à cette question (s'applique aux versions antérieures à 7.2.0)
PHP a sa part dans les ruelles sombres que vous vraiment ne voulez pas vous trouver à l'intérieur. Les propriétés de l'objet avec les noms qui sont des nombres est l'un d'entre eux...
Ce qu'ils n'ont jamais dit que vous
Fait #1: Vous ne pouvez pas accéder à des propriétés avec des noms qui ne sont pas des noms de variables facilement
Fait #2: Vous peut accéder à ces propriétés avec accolade syntaxe
Fait #3: Mais pas si le nom de la propriété est tous les chiffres!
Live exemple.
Fait #4: Bien, sauf si l'objet n'est pas venu à partir d'un tableau en premier lieu.
Live exemple.
Assez intuitive, ne convenez-vous pas?
Ce que vous pouvez faire
Option #1: faire manuellement
La méthode la plus pratique est tout simplement de jeter l'objet qui vous intéresse dans le dos dans un tableau, ce qui vous permettra d'accéder aux propriétés:
Malheureusement, cela ne fonctionne pas de manière récursive. Si dans votre cas, vous 'd besoin de faire quelque chose comme:
Option #2: l'option nucléaire
Une approche alternative serait d'écrire une fonction qui convertit les objets à des tableaux de manière récursive:
Cependant, je ne suis pas convaincu que c'est une meilleure option à travers le conseil, car il sera coulé inutilement à des tableaux de toutes les propriétés que vous pas intéressés, ainsi que ceux vous êtes.
Option #3: lecture de ton
Une alternative de l'option précédente est d'utiliser le construit en JSON fonctions:
Le JSON fonctions utile d'effectuer un appel récursif à la conversion d'une matrice, sans la nécessité de définir des fonctions externes. Cependant souhaitable que cela ressemble, il a le "nuke" inconvénient de l'option n ° 2 et en outre l'inconvénient que si il y a toutes les cordes à l'intérieur de votre objet, ces chaînes doit être encodés en UTF-8 (ce qui est une exigence de
json_encode
).->date
ou->timezone
, seulementnull
est retourné. J'ai remarqué que si je var_dumped l'objet avant d'utiliser ces propriétés, les valeurs propres sont retournés. Le clonage ne résout pas ce problème, donc je suppose qu'il a vraiment quelque chose à voir avec l'accèsvar_dump
n'... Puis j'ai vu votre Option #1 et voilá, l'accès comme un tableau ($objCastAsArray['date']
) a fonctionné comme un charme.$o = unserialize('O:8:"StdClass"' . substr(serialize($a),1));
Voulais juste ajouter de Jon éloquent explication de la raison pour laquelle cela échoue. C'est à cause lors de la création d'un tableau en php convertit clés entiers — si elle peut qui provoque des problèmes de recherche sur les tableaux qui ont été exprimés à des objets, tout simplement parce que le clavier numérique est préservée. C'est problématique parce que tous les accès aux propriétés des options d'attendre ou de convertir des chaînes de caractères. Vous pouvez le vérifier en procédant de la manière suivante:
Qui de sortie:
Si l'objet a deux propriété touches, numérique (qui ne peut être accessible) et une chaîne de caractères en fonction. C'est la raison pour laquelle Jon
#Fact 4
fonctionne, parce que par définition de la propriété à l'aide d'accolades signifie que vous toujours définir une chaîne à la clé, plutôt que numérique.Jon solution, mais elle tourne sur sa tête, vous pouvez générer un objet à partir de votre tableau qui a toujours basé sur des chaînes de clés en procédant comme suit:
Partir de maintenant, vous pouvez utiliser l'une des conditions suivantes parce que l'accès de cette manière toujours convertit la valeur à l'intérieur de l'accolade à une chaîne:
Bon vieux illogique PHP...
J'avais copié cette fonction à partir du net. Si tout fonctionne comme il est dit ("la Fonction de Convertir stdClass Objets pour les Tableaux Multidimensionnels"), essayez les solutions suivantes:
objectToArray
fonction[highlighting][448364][Data][0]
Source: PHP stdClass de Tableau et Tableau de stdClass
Une alternative finale de Jon réponse complète:
Simplement utiliser la fonction json_decode() avec le second jeu de paramètres à vrai.
Ce puis retourne un tableau associatif plutôt que d'un objet, donc pas besoin de convertir après le fait.
Cela peut ne pas être adapté à chaque application, mais il m'a vraiment aidé à facilement référence à une propriété de l'oroginal objet.
Solution a été trouvée dans ce tutoriel - http://nitschinger.at/Handling-JSON-like-a-boss-in-PHP/
Ce qui concerne
Accéder aux propriétés de l'Objet ayant des numéros comme nom de propriété.
Plus besoin après la coulée tableau d'objet.
Je crains que vous ne sont pas autorisés à nommer des objets commençant par des nombres. Renommer le premier "448364", à commencer par une lettre.
Le second est un tableau, ceux qui sont accessibles par des crochets, comme ceci:
au lieu
Si un objet commence par
@
comme:Vous devez utiliser:
parce que
$parent_object->{'@attributes'}
ou$parent_object['@attributes']
ne fonctionne pas.