【问题标题】:Accessing Object with Key as Number PHP [duplicate]使用键作为数字 PHP 访问对象 [重复]
【发布时间】:2013-06-14 02:26:52
【问题描述】:

我有一个看起来像这样的对象:

stdClass Object
(
    [page] => stdClass Object
        (
            [1] => stdClass Object
                (
                    [element] => stdClass Object
                        (
                            [background_color] => stdClass Object
...

当我打印print_r($arr->page):

stdClass Object
(
    [1] => stdClass Object
        (
            [element] => stdClass Object
                (
                    [background_color] => stdClass Object
                        (

但这什么也没打印:

print_r($arr->page->{"1"});

这会打印一个错误:

print_r($arr->page->1); 

解析错误:语法错误,意外的 T_LNUMBER,需要 T_STRING 或 T_VARIABLE 或 '{' 或 '$' i

如何访问“1”元素?

更新:

我也尝试过$arr->page[1]$arr->page["1"],但得到了这个错误:

致命错误:不能将 stdClass 类型的对象用作数组

更新 2:

var_dump($arr->page);

打印这个:

 object(stdClass)#3 (1) {   [1]=>   
   object(stdClass)#4 (1) {
     ["element"]=>
     object(stdClass)#5 (20) {
       ["background_color"]=>
       object(stdClass)#6 (7) {

【问题讨论】:

  • 对不起,但我已经尝试过这个答案,正如我的问题所示,它对我不起作用,有什么想法为什么它不起作用?
  • var_dump($arr->page->{'1'}) 打印 NULL
  • 感谢您的意见 Jack,请查看正确答案以获取更多信息。
  • 我刚开始在一个大型应用程序中工作,我需要修改对象内部的一些值。我不确定它是在哪里或如何创建的。但随着我深入挖掘,我会学到更多。
  • 对于那些有兴趣复制这个问题的人,使用这个:$arr = (object)['page' => (object)[1 => (object)['element' => 'hello world']]];

标签: php oop object


【解决方案1】:

使用引号:

print_r($arr->page->{'1'});

从这里:How can I access an object attribute that starts with a number?

【讨论】:

  • 抱歉,这对我没有任何作用?单引号或双引号
  • 查看stackoverflow.com/questions/3446216/…了解PHP中单引号和双引号的区别。
  • 这仅适用于字符串键 "1"int(1)。如果一个对象是通过“非法”方式创建的,那么你不能像这样访问整数键。
  • 不知道,感谢您的澄清
【解决方案2】:

您不能直接访问整数类变量。最好的选择是根本不使用 StdClass。

如果您无法控制数据的来源,您可以通过$foo = (array) $foo 强制转换为数组。

你也可以遍历元素:

foreach ($obj as $key=>$val)

或者

foreach (get_object_vars($obj) as $key => $val)

【讨论】:

  • 哇真的,我不知道,我没有投票给你,我会尝试投和foreach
  • 有效!谢谢,我必须记住这一点,只是为了澄清我在foreach ($obj as $key=>$val)$val->element 中使用了您的第一个示例,让我访问,再次感谢!
  • @Jack,说得好。我已经从答案中删除了那一点。我想我记得我曾经处理过一些粗略的库,这些库无缘无故地将 API 结果盲目地转换为对象。
  • 你是说json_decode()之前有一段时间吗? 喘息 :)
猜你喜欢
  • 2018-10-26
  • 1970-01-01
  • 2015-01-05
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
相关资源
最近更新 更多