Atualizado para PHP 7.2
O PHP 7.2 introduziu uma mudança comportamental para converter chaves numéricas em object e array casts , que corrige esta inconsistência em particular e faz com que todos os exemplos a seguir se comportem como esperado.
Uma coisa a menos para se confundir!
Resposta original (aplica-se a versões anteriores a 7.2.0)
PHP tem sua cota de becos sombrios nos quais você realmente não quer se encontrar. Propriedades de objeto com nomes que são números é um deles ...
O que eles nunca te disseram
Fato nº 1: você não pode acessar propriedades com nomes que não sejam nomes de variáveis legais facilmente
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo; // error
Fato nº 2: você pode acessar essas propriedades com a sintaxe de chaves
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
Fato nº 3: mas não se o nome da propriedade tiver apenas dígitos!
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
echo $o->{'123'}; // error!
Exemplo ao vivo .
Fato # 4: Bem, a menos que o objeto não venha de um array em primeiro lugar.
$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?
Exemplo ao vivo .
Muito intuitivo, não concorda?
O que você pode fazer
Opção nº 1: faça manualmente
A abordagem mais prática é simplesmente converter o objeto no qual você está interessado de volta em uma matriz, o que permitirá que você acesse as propriedades:
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'}; // error!
echo $a['123']; // OK!
Infelizmente, isso não funciona recursivamente. Portanto, no seu caso, você precisaria fazer algo como:
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0']; // at last!
Opção 2: a opção nuclear
Uma abordagem alternativa seria escrever uma função que converte objetos em matrizes recursivamente:
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'];
No entanto, não estou convencido de que essa seja a melhor opção em todos os aspectos, porque ela lançará em matrizes desnecessariamente todas as propriedades nas quais você não está interessado, assim como aquelas em que você está.
Opção nº 3: jogar com inteligência
Uma alternativa à opção anterior é usar as funções JSON integradas:
$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];
As funções JSON realizam de forma útil uma conversão recursiva em array sem a necessidade de definir quaisquer funções externas. Por mais desejável que pareça, ele tem a desvantagem "nuke" da opção # 2 e, adicionalmente, a desvantagem de que se houver qualquer string dentro do seu objeto, essas strings devem ser codificadas em UTF-8 (este é um requisito de json_encode
).