Aggiornato per PHP 7.2
PHP 7.2 ha introdotto una modifica comportamentale alla conversione delle chiavi numeriche nei cast di oggetti e array , che risolve questa particolare incoerenza e fa sì che tutti i seguenti esempi si comportino come previsto.
Una cosa in meno su cui essere confusi!
Risposta originale (si applica alle versioni precedenti alla 7.2.0)
PHP ha la sua parte di vicoli bui in cui davvero non vuoi trovarti. Le proprietà degli oggetti con nomi che sono numeri è una di queste ...
Quello che non ti hanno mai detto
Fatto # 1: non è possibile accedere facilmente a proprietà con nomi che non sono nomi di variabili legali
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo;
Fatto # 2: È possibile accedere a tali proprietà con la sintassi parentesi graffa
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
Fatto # 3: ma non se il nome della proprietà è composto da sole cifre!
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
echo $o->{'123'};
Esempio dal vivo .
Fatto # 4: beh, a meno che l'oggetto non provenga da un array in primo luogo.
$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123';
echo $o1->{'123'};
echo $o2->{'123'};
Esempio dal vivo .
Abbastanza intuitivo, non sei d'accordo?
Cosa puoi fare
Opzione n. 1: fallo manualmente
L'approccio più pratico è semplicemente eseguire il cast dell'oggetto che ti interessa in un array, che ti consentirà di accedere alle proprietà:
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'};
echo $a['123'];
Sfortunatamente, questo non funziona in modo ricorsivo. Quindi nel tuo caso dovresti fare qualcosa come:
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0'];
Opzione n. 2: l'opzione nucleare
Un approccio alternativo sarebbe scrivere una funzione che converte gli oggetti in array in modo ricorsivo:
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'];
Tuttavia, non sono convinto che questa sia un'opzione migliore su tutta la linea perché invierà inutilmente agli array tutte le proprietà che non ti interessano così come quelle che sei.
Opzione n. 3: giocare in modo intelligente
Un'alternativa all'opzione precedente consiste nell'usare le funzioni JSON integrate:
$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];
Le funzioni JSON eseguono utilmente una conversione ricorsiva in array senza la necessità di definire alcuna funzione esterna. Per quanto desiderabile sembri, ha lo svantaggio "nucleare" dell'opzione # 2 e inoltre lo svantaggio che se ci sono stringhe all'interno del tuo oggetto, quelle stringhe devono essere codificate in UTF-8 (questo è un requisito di json_encode).