我正在使用json_decode()类似的东西:
json_decode()
$myVar = json_decode($data)
这给了我这样的输出:
[highlighting] => stdClass Object ( [448364] => stdClass Object ( [Data] => Array ( [0] => Tax amount liability is .......
我想访问键[0]中的字符串值。当我尝试做类似的事情时:
print $myVar->highlighting->448364->Data->0;
我收到此错误:
解析错误:语法错误,意外的T_DNUMBER
这两个数字/整数似乎有问题。
PHP7.2引入了一种行为上的更改,以转换对象和数组类型转换中的数字键,从而解决了这一特殊的不一致问题,并使以下所有示例的行为均符合预期。
少一件值得困惑的事情!
PHP拥有许多黑暗的小巷,您 确实 不想在其中发现自己。名称为数字的对象属性是其中之一…
事实1: 您不能轻易访问名称不是合法变量名称的属性
$a = array('123' => '123', '123foo' => '123foo'); $o = (object)$a; echo $o->123foo; // error
事实2: 您 可以 使用大括号语法访问此类属性
$a = array('123' => '123', '123foo' => '123foo'); $o = (object)$a; echo $o->{'123foo'}; // OK!
事实#3: 但是 没有 如果属性名称是所有的数字!
$a = array('123' => '123', '123foo' => '123foo'); $o = (object)$a; echo $o->{'123foo'}; // OK! echo $o->{'123'}; // error!
事实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?
很直观,你不同意吗?
选项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!
选择2:核选择
一种替代方法是编写一个将对象递归转换为数组的函数:
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'];
但是,我不认为这是一个更好的选择,因为它会不必要地将所有您 不 感兴趣的属性以及您所 不 感兴趣的属性强制转换为数组。
选择#3:发挥聪明
上一个选项的替代方法是使用内置的JSON函数:
$arr = json_decode(json_encode($myVar), true); $value = $arr['highlighting']['448364']['Data']['0'];
JSON函数有助于对数组进行递归转换,而无需定义任何外部函数。无论看上去多么理想,它都具有选项#2的“ nuke”缺点, 另外还有_一个缺点,即如果对象中有任何字符串,则这些字符串 _必须 以UTF-8编码(这是的要求json_encode
json_encode