Updated for PHP 7.2
PHP 7.2向做了一项行为改变,在标语和阵列中贴上数字钥匙,从而消除了这一特别不一致之处,并按预期举出以下所有例子。
One less thing to be confused about!
Original answer (applies to versions earlier than 7.2.0)
PHP在你直线的黑暗面上所占的份额 不要在内部发现。 标有编号的特性之一......
What they never told you
<><>Fact #1: 你们不能用不易法律变更的名称查阅财产。
$a = array( 123 => 123 , 123foo => 123foo );
$o = (object)$a;
echo $o->123foo; // error
Fact #2: You can access such properties with curly brace syntax
$a = array( 123 => 123 , 123foo => 123foo );
$o = (object)$a;
echo $o->{ 123foo }; // OK!
http://www.ohchr.org。 但是,如果财产名称是所有数字,那么not!
$a = array( 123 => 123 , 123foo => 123foo );
$o = (object)$a;
echo $o->{ 123foo }; // OK!
echo $o->{ 123 }; // error!
rel=“noretinger”>Live example。
<>0>Fact #4: 最好,除非物体先从阵列中排出。
$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?
Live example.
tty tu tu ??
What you can do
<>pstrong>Option #1:
最为实际的做法是将你感兴趣的物体重新归入一个阵列,使你能够获取这些财产:
$a = array( 123 => 123 , 123foo => 123foo );
$o = (object)$a;
$a = (array)$o;
echo $o->{ 123 }; // error!
echo $a[ 123 ]; // OK!
不幸的是,这并不令人厌恶。 因此,就你而言,你需要做这样的事情:
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting[ 448364 ]->Data;
$value = $data[ 0 ]; // at last!
Option #2: the nuclear option
另一种做法是写一种功能,将物体重新转换成阵列:
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 ];
然而,我并不认为,这是整个方案上更好的选择,因为它将毫无必要地把你所关心的所有财产(not<>em>)和你们所关心的所有财产都划入。
Option #3: playing it clever
以前选择的另一种选择是利用初等干事的现有职能:
$arr = json_decode(json_encode($myVar), true);
$value = $arr[ highlighting ][ 448364 ][ Data ][ 0 ];
初专干事的职能有助于在无需界定任何外部职能的情况下重新转换成阵列。 不管怎样,它还是对选择2和附加的“nuke”不利。 下述不利之处:如果在物体内有任何座标,则这些座标在UTF-8上编码(这是json_encode
<<<>>>>>。