J'utilise json_decode()
quelque chose comme:
$myVar = json_decode($data)
Ce qui me donne une sortie comme celle-ci:
[highlighting] => stdClass Object
(
[448364] => stdClass Object
(
[Data] => Array
(
[0] => Tax amount liability is .......
Je veux accéder à la valeur de chaîne dans la clé [0]. Quand j'essaye de faire quelque chose comme:
print $myVar->highlighting->448364->Data->0;
J'obtiens cette erreur:
Erreur d'analyse: erreur de syntaxe, T_DNUMBER inattendu
Les deux nombres / entiers semblent poser problème.
php
object
properties
avinash shah
la source
la source
Réponses:
Mis à jour pour PHP 7.2
PHP 7.2 a introduit un changement de comportement dans la conversion des clés numériques dans les casts d'objets et de tableaux , ce qui corrige cette incohérence particulière et fait que tous les exemples suivants se comportent comme prévu.
Une chose de moins à confondre!
Réponse d'origine (s'applique aux versions antérieures à 7.2.0)
PHP a son lot de ruelles sombres dans lesquelles vous ne voulez vraiment pas vous retrouver. Les propriétés d'objet avec des noms qui sont des nombres en font partie ...
Ce qu'ils ne t'ont jamais dit
Fait n ° 1: vous ne pouvez pas accéder facilement aux propriétés avec des noms qui ne sont pas des noms de variables légaux
Fait n ° 2: Vous pouvez accéder à ces propriétés avec la syntaxe d'accolades
Fait n ° 3: Mais pas si le nom de la propriété est composé de chiffres!
Exemple en direct .
Fait # 4: Eh bien, à moins que l'objet ne provienne d'un tableau en premier lieu.
Exemple en direct .
Assez intuitif, n'êtes-vous pas d'accord?
Ce que tu peux faire
Option 1: faites-le manuellement
L'approche la plus pratique est simplement de reconstituer l'objet qui vous intéresse dans un tableau, ce qui vous permettra d'accéder aux propriétés:
Malheureusement, cela ne fonctionne pas de manière récursive. Donc, dans votre cas, vous devez faire quelque chose comme:
Option n ° 2: l'option nucléaire
Une approche alternative serait d'écrire une fonction qui convertit les objets en tableaux de manière récursive:
Cependant, je ne suis pas convaincu que ce soit une meilleure option dans tous les domaines, car il sera inutilement converti en tableaux toutes les propriétés qui ne vous intéressent pas ainsi que celles qui vous intéressent.
Option 3: jouer intelligemment
Une alternative à l'option précédente consiste à utiliser les fonctions JSON intégrées:
Les fonctions JSON effectuent utilement une conversion récursive en tableau sans avoir besoin de définir de fonctions externes. Aussi souhaitable que cela puisse paraître, il présente l'inconvénient "nuke" de l'option n ° 2 et en plus l'inconvénient que s'il y a des chaînes dans votre objet, ces chaînes doivent être encodées en UTF-8 (c'est une exigence de
json_encode
).la source
->date
ou->timezone
, seulenull
est retournée. J'ai remarqué que si je var_dumped l'objet avant d'utiliser ces propriétés, les valeurs appropriées sont renvoyées. Le clonage ne résout pas cela, donc je suppose que cela a vraiment quelque chose à voir avec l'accès qui levar_dump
fait ... Ensuite, j'ai vu votre option n ° 1 et voilá, y accéder en tant que tableau ($objCastAsArray['date']
) fonctionnait comme un charme.$o = unserialize('O:8:"StdClass"' . substr(serialize($a),1));
Je voulais juste ajouter à l'explication éloquente de Jon la raison pour laquelle cela échoue. Tout cela parce que lors de la création d'un tableau, php convertit les clés en entiers - s'il le peut - ce qui pose des problèmes de recherche sur les tableaux qui ont été convertis en objets, simplement parce que la clé numérique est conservée. Ceci est problématique car toutes les options d'accès aux propriétés s'attendent ou se convertissent en chaînes. Vous pouvez le confirmer en procédant comme suit:
Ce qui produirait:
Ainsi, l'objet a deux clés de propriété, une numérique (inaccessible) et une basée sur une chaîne. C'est la raison pour laquelle Jon
#Fact 4
fonctionne, car en définissant la propriété à l'aide d'accolades, cela signifie que vous définissez toujours une clé basée sur une chaîne, plutôt que numérique.En prenant la solution de Jon, mais en la tournant sur sa tête, vous pouvez générer un objet à partir de votre tableau qui a toujours des clés basées sur des chaînes en procédant comme suit:
À partir de maintenant, vous pouvez utiliser l'un des éléments suivants, car l'accès de cette manière convertit toujours la valeur à l'intérieur de l'accolade en chaîne:
Bon vieux PHP illogique ...
la source
Si un objet commence par
@
comme:Vous devez utiliser:
parce que
$parent_object->{'@attributes'}
ou$parent_object['@attributes']
ne fonctionnera pas.la source
J'avais copié cette fonction sur le net. Si cela fonctionne comme indiqué ("Fonction de conversion d'objets stdClass en tableaux multidimensionnels"), essayez ce qui suit:
objectToArray
fonctionner[highlighting][448364][Data][0]
Source: PHP stdClass vers Array et Array vers stdClass
la source
Une dernière alternative à la réponse complète de Jon:
Utilisez simplement json_decode () avec le deuxième paramètre défini sur true .
Cela renvoie alors un tableau associatif plutôt qu'un objet, donc pas besoin de convertir après coup.
Cela peut ne pas convenir à toutes les applications, mais cela m'a vraiment aidé à référencer facilement une propriété de l'objet oroginal.
La solution a été trouvée dans ce tutoriel - http://nitschinger.at/Handling-JSON-like-a-boss-in-PHP/
Cordialement
la source
Accès aux propriétés d'objets ayant des nombres comme nom de propriété. Principalement nécessaire après la conversion du tableau en objet.
la source
J'ai peur que vous ne soyez pas autorisé à nommer des objets en commençant par des chiffres. Renommez le premier "448364" en commençant par une lettre.
Le second est un tableau, ceux-ci sont accessibles par des crochets comme ceci:
au lieu
la source