Mise à jour pour PHP 7.2
PHP 7.2 a introduit un changement comportemental pour conversion des clés numériques dans les casts d'objets et de tableaux qui corrige cette incohérence particulière et fait en sorte que tous les exemples suivants se comportent comme prévu.
Une chose de moins pour laquelle il faut s'embrouiller !
Réponse originale (s'applique aux versions antérieures à 7.2.0)
Le PHP a sa part de ruelles sombres que vous vraiment ne veulent pas se retrouver à l'intérieur. Les propriétés des objets dont les noms sont des nombres en font partie...
Ce qu'ils ne vous ont jamais dit
Fait n° 1 : Vous ne pouvez pas accéder facilement aux propriétés dont le nom n'est pas un nom de variable légal.
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo; // error
Fait n°2 : Vous peut accéder à ces propriétés avec la syntaxe de l'accolade
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
Fait n°3 : Mais no si le nom de la propriété est composé de tous les chiffres !
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
echo $o->{'123'}; // error!
Exemple concret .
Fait n°4 : A moins que l'objet ne provienne pas 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 concret .
Plutôt intuitif, vous ne trouvez pas ?
Ce que vous pouvez faire
Option n° 1 : le faire manuellement
L'approche la plus pratique consiste simplement à retranscrire 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 autre approche consisterait à é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 qu'il s'agisse d'une meilleure option dans tous les cas, car elle convertira inutilement en tableaux toutes les propriétés que vous êtes en train d'utiliser. no qui vous intéressent, ainsi que ceux qui vous intéressent.
Option n° 3 : jouer la carte de l'intelligence
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 qu'il soit nécessaire de définir des fonctions externes. Aussi désirable que cela puisse paraître, cette option présente l'inconvénient de l'option n° 2. et en outre l'inconvénient que s'il y a des chaînes de caractères à l'intérieur de votre objet, ces chaînes de caractères doit doivent être encodés en UTF-8 (il s'agit d'une exigence de l'UE). json_encode
).