当前位置: 首页 > 知识库问答 >
问题:

如何访问名为整数或无效属性名的对象属性?

狄宜然
2023-03-14

我使用的是json\u 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

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

共有3个答案

东郭弘方
2023-03-14

如果一个对象以@开头,比如:

SimpleXMLElement Object (
    [@attributes] => Array (
        [href] => qwertyuiop.html
        [id] => html21
        [media-type] => application/xhtml+xml
    )
)

您必须使用:

print_r($parent_object->attributes());

因为$parent\u对象-

锺星洲
2023-03-14

只是想在Jon雄辩的解释中补充一下失败的原因。这都是因为在创建数组时,php会将键转换为整数(如果可以的话),这会导致在已转换为对象的数组上查找问题,这仅仅是因为保留了数字键。这是有问题的,因为所有属性访问选项都期望或转换为字符串。您可以通过执行以下操作来确认这一点:

$arr = array('123' => 'abc');
$obj = (object) $arr;
$obj->{'123'} = 'abc';
print_r( $obj );

它将输出:

stdClass Object ( 
  [123] => 'abc', 
  [123] => 'abc'
)

因此,对象有两个属性键,一个数字键(无法访问)和一个基于字符串的键。这就是Jon的#Fact 4有效的原因,因为通过使用大括号设置属性意味着您总是定义基于字符串的键,而不是数字键。

以Jon的解决方案为例,但将其完全颠倒过来,您可以通过执行以下操作从数组中生成始终具有基于字符串的键的对象:

$obj = json_decode(json_encode($arr));

从现在起,您可以使用以下任一方法,因为以这种方式访问总是将大括号内的值转换为字符串:

$obj->{123};
$obj->{'123'};

好老不合逻辑的PHP...

裴弘
2023-03-14

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'];

但是,我不认为这是一个更好的选择,因为它将不必要地将所有您不感兴趣的属性以及您感兴趣的属性转换为数组。

选择三:耍小聪明

上一个选项的另一种选择是使用内置的JSON函数:

$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];

JSON函数可以帮助执行到数组的递归转换,而无需定义任何外部函数。无论这看起来多么令人满意,它都有选项2的“核”缺点,另外还有一个缺点,即如果对象中有任何字符串,那么这些字符串必须用UTF-8编码(这是json\u encode的要求)。

 类似资料:
  • 问题内容: 我正在使用类似的东西: 这给了我这样的输出: 我想访问键[0]中的字符串值。当我尝试做类似的事情时: 我收到此错误: 解析错误:语法错误,意外的T_DNUMBER 这两个数字/整数似乎有问题。 问题答案: PHP7.2引入了一种行为上的更改,以转换对象和数组类型转换中的数字键,从而解决了这一特殊的不一致问题,并使以下所有示例的行为均符合预期。 少一件值得困惑的事情! 原始答案(适用于7

  • 问题内容: JSON编码的Google API返回了这样的对象 谁知道我该如何获取价值? 显然返回 注意:未定义的变量:在/ usr / local / … 致命错误:无法访问/ ....中的空属性 问题答案: 由于属性的名称是string ,因此可以这样访问它: 另外,您可以将属性的名称放在变量中,然后像这样使用它: 您可以在repl.it上看到它们的实际作用:https ://repl.it/

  • 问题内容: 我正在编写一个与已在使用的Google Analytics(分析)API交互的Angular应用。Google返回的数据以“ ga:”为前缀,例如“ ga:newVisits”示例。 如果我使用表达式{{total.ga:newVisits}},Angular无法解析它。逃避冒号继续的任何尝试均导致错误或完全逃避我的表达。 如何将{{total.ga:newVisits}}传递给Ang

  • 问题内容: 我正在尝试找出对javascript对象的属性名称有效的内容。例如 b [‘-^ colour’]无效,但在所有浏览器中都存在古怪的现象,我不应该相信它会继续向前发展 b [‘-^ colour’]是完全有效的,但它的形式只能以这种方式访问​​-(受支持,所以对象也许可以用作地图?) 还有别的 顺便说一句,在javascript中,全局变量可能在顶层声明为 但也可以(据我所知)与 以下

  • 问题内容: 根据官方的JavaScript文档,您可以使用整数定义对象文字属性名称: 此外,您可以使用数字或字符串文字作为属性的名称。 像这样: 我的问题是,如何引用以整数作为名称的属性?我尝试了平常的尝试,但是遇到了错误。我能想到的唯一解决方法是使用循环。有什么建议? 问题答案: 您可以像引用数组一样引用对象的属性,并使用或

  • 问题内容: 如何给定的属性的值? 问题答案: 有称为和的内置函数 在这种情况下