Diperbarui untuk PHP 7.2
PHP 7.2 memperkenalkan perubahan perilaku untuk mengubah kunci numerik dalam cast objek dan array , yang memperbaiki inkonsistensi khusus ini dan membuat semua contoh berikut berperilaku seperti yang diharapkan.
Satu hal lagi yang perlu dibingungkan!
Jawaban asli (berlaku untuk versi sebelum 7.2.0)
PHP memiliki bagiannya dalam lorong-lorong gelap yang Anda benar - benar tidak ingin berada di dalamnya. Properti objek dengan nama yang berupa angka adalah salah satunya ...
Apa yang mereka tidak pernah katakan padamu
Fakta # 1: Anda tidak dapat mengakses properti dengan nama yang bukan nama variabel legal dengan mudah
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo;
Fakta # 2: Anda dapat mengakses properti tersebut dengan sintaks kurung kurawal
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
Fakta # 3: Tetapi tidak jika nama properti adalah semua angka!
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
echo $o->{'123'};
Contoh langsung .
Fakta # 4: Kecuali jika objek tersebut tidak berasal dari larik.
$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123';
echo $o1->{'123'};
echo $o2->{'123'};
Contoh langsung .
Cukup intuitif, bukankah Anda setuju?
Apa yang dapat Anda lakukan
Opsi # 1: lakukan secara manual
Pendekatan paling praktis adalah dengan mentransmisikan kembali objek yang Anda minati ke dalam array, yang memungkinkan Anda mengakses properti:
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'};
echo $a['123'];
Sayangnya, ini tidak berfungsi secara rekursif. Jadi dalam kasus Anda, Anda perlu melakukan sesuatu seperti:
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0'];
Opsi # 2: opsi nuklir
Pendekatan alternatifnya adalah menulis fungsi yang mengonversi objek menjadi array secara rekursif:
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'];
Namun, saya tidak yakin bahwa ini adalah pilihan yang lebih baik secara keseluruhan karena ini akan membuang semua properti yang tidak Anda minati dan juga yang Anda minati.
Opsi # 3: Memainkannya dengan Cerdas
Alternatif dari opsi sebelumnya adalah menggunakan fungsi JSON bawaan:
$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];
Fungsi JSON membantu melakukan konversi rekursif ke array tanpa perlu menentukan fungsi eksternal apa pun. Betapa pun diinginkannya tampilannya, ia memiliki kelemahan "nuke" dari opsi # 2 dan juga kerugiannya bahwa jika ada string di dalam objek Anda, string tersebut harus dikodekan dalam UTF-8 (ini adalah persyaratan json_encode
).