小编典典

如何访问具有整数或无效属性名称等名称的对象属性?

php

我正在使用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

这两个数字/整数似乎有问题。


阅读 175

收藏
2022-05-12

共1个答案

小编典典

更新为 PHP 7.2

PHP 7.2 引入了在对象和数组转换中转换数字键的行为更改,它修复了这种特殊的不一致性并使以下所有示例的行为都符合预期。

少一件事要混淆!


原始答案(适用于 7.2.0 之前的版本)

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)。

2022-05-12