Actualizado para PHP 7.2
PHP 7.2 introdujo un cambio de comportamiento en la conversión de claves numéricas en conversiones de objetos y matrices , que corrige esta inconsistencia particular y hace que todos los siguientes ejemplos se comporten como se esperaba.
¡Una cosa menos por la que estar confundido!
Respuesta original (se aplica a versiones anteriores a la 7.2.0)
PHP tiene su parte de callejones oscuros en los que realmente no quieres encontrarte dentro. Las propiedades de objetos con nombres que son números es una de ellas ...
Lo que nunca te dijeron
Hecho # 1: No puede acceder fácilmente a propiedades con nombres que no son nombres de variables legales
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo;
Hecho # 2: Usted puede acceder a estas propiedades con la sintaxis de corchete
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
Hecho # 3: ¡ Pero no si el nombre de la propiedad es todo dígitos!
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
echo $o->{'123'};
Ejemplo vivo .
Hecho # 4: Bueno, a menos que el objeto no provenga de una matriz en primer lugar.
$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123';
echo $o1->{'123'};
echo $o2->{'123'};
Ejemplo vivo .
Bastante intuitivo, ¿no estás de acuerdo?
Lo que puedes hacer
Opción # 1: hazlo manualmente
El enfoque más práctico es simplemente convertir el objeto que le interesa de nuevo en una matriz, lo que le permitirá acceder a las propiedades:
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'};
echo $a['123'];
Desafortunadamente, esto no funciona de forma recursiva. Entonces, en su caso, necesitaría hacer algo como:
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0'];
Opción # 2: la opción nuclear
Un enfoque alternativo sería escribir una función que convierta objetos en matrices de forma recursiva:
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'];
Sin embargo, no estoy convencido de que esta sea una mejor opción en todos los ámbitos porque, innecesariamente, enviará a matrices todas las propiedades que no le interesan y las que le interesan.
Opción n. ° 3: jugar de manera inteligente
Una alternativa a la opción anterior es utilizar las funciones JSON integradas:
$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];
Las funciones JSON realizan de manera útil una conversión recursiva a una matriz sin la necesidad de definir funciones externas. Por muy deseable que parezca, tiene la desventaja "nuclear" de la opción # 2 y además la desventaja de que si hay cadenas dentro de su objeto, esas cadenas deben estar codificadas en UTF-8 (este es un requisito de json_encode
).