PHP 7.2 için güncellendi
PHP 7.2 , nesne ve dizi yayınlarında sayısal anahtarları dönüştürmek için davranışsal bir değişiklik getirdi bu belirli tutarsızlığı gideren ve aşağıdaki örneklerin hepsinin beklendiği gibi davranmasını sağlayan .
Kafası karıştırılacak bir şey daha az!
Orijinal cevap (7.2.0'dan önceki sürümler için geçerlidir)
PHP'nin karanlık sokaklardaki payı gerçekten içinde bulmak istemediğiniz . İsimleri sayı olan nesne özellikleri bunlardan biridir ...
Sana asla söylemedikleri
Gerçek 1: Yasal değişken adları olmayan adlara sahip mülklere kolayca erişemezsiniz
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo;
Aslında # 2: Sen edebilirsiniz küme ayracı sözdizimi ile böyle özelliklere erişmek
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
Aslında # 3: Ama değil özellik adı sadece rakamlardan oluşan eğer!
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
echo $o->{'123'};
Canlı örnek .
Gerçek 4: Şey, nesne ilk etapta bir diziden gelmediği sürece.
$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123';
echo $o1->{'123'};
echo $o2->{'123'};
Canlı örnek .
Oldukça sezgisel, katılmıyor musun?
Ne yapabilirsin
Seçenek 1: Manuel olarak yapın
En pratik yaklaşım, ilgilendiğiniz nesneyi, özelliklere erişmenizi sağlayacak bir diziye geri döndürmektir:
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'};
echo $a['123'];
Ne yazık ki, bu yinelemeli olarak çalışmıyor. Yani senin durumunda şöyle bir şey yapman gerekecek:
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0'];
Seçenek # 2: nükleer seçenek
Alternatif bir yaklaşım, nesneleri yinelemeli olarak dizilere dönüştüren bir işlev yazmak olabilir:
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'];
Ancak, I 'm bu gereksiz sen olduğunu tüm özelliklerinin diziler artığını çünkü bu yönüyle daha iyi bir seçenek olduğunu ikna olmadım değil senin gibi sıra ilgilenen.
Seçenek # 3: Akıllıca oynamak
Önceki seçeneğin bir alternatifi, yerleşik JSON işlevlerini kullanmaktır:
$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];
JSON işlevleri, herhangi bir harici işlevi tanımlamaya gerek kalmadan diziye özyinelemeli bir dönüştürme gerçekleştirir. Bununla birlikte, bu görünüme sahip olmak istenirse , seçenek # 2'nin "nükleer" dezavantajına ve ayrıca nesnenizin içinde herhangi bir dizge varsa, bu dizelerin UTF-8'de kodlanması gerektiği dezavantajına sahiptir (bu bir gerekliliktir json_encode
).