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
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo; // error
Fait n ° 2: Vous pouvez accéder à ces propriétés avec la syntaxe d'accolades
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
Fait n ° 3: Mais pas si le nom de la propriété est composé de chiffres!
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
echo $o->{'123'}; // error!
Exemple en direct .
Fait # 4: Eh bien, à moins que l'objet ne provienne d'un tableau en premier lieu.
$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123'; // setting property is OK
echo $o1->{'123'}; // error!
echo $o2->{'123'}; // works... WTF?
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:
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'}; // error!
echo $a['123']; // OK!
Malheureusement, cela ne fonctionne pas de manière récursive. Donc, dans votre cas, vous devez faire quelque chose comme:
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0']; // at last!
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:
function recursive_cast_to_array($o) {
$a = (array)$o;
foreach ($a as &$value) {
if (is_object($value)) {
$value = recursive_cast_to_array($value);
}
}
return $a;
}
$arr = recursive_cast_to_array($myVar);
$value = $arr['highlighting']['448364']['Data']['0'];
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:
$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];
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
).