按索引号(而非名称)返回PHP对象

14

目标:通过编号从PHP对象中检索数据元素。

这是对象的print_r($data):

stdClass Object
(
    [0] => stdClass Object
        (
            [TheKey] => 1456
            [ThingName] => Malibu
            [ThingID] => 7037
            [MemberOf] => California
            [ListID] => 7035
            [UserID] => 157
            [UserName] => John Doe
        )
)

我无法弄清楚如何从中提取值。这只是一个多记录对象中的一条记录,应该按id而不是名称进行。

以下是一些未成功的尝试,以说明目标:

echo $data -> 0 -> UserName;
echo $data[0] -> UserName;
5个回答

39

通常情况下,PHP变量名不能以数字开头。您无法像访问数组一样访问$data,因为stdClass没有实现ArrayAccess——它只是一个普通的基类。

但是,在这种情况下,您可以尝试通过其数字名称访问对象属性,像这样:

echo $data->{'0'}->UserName;
我能想到Spudley的答案会导致错误的唯一原因是你正在运行PHP 4,它不支持使用foreach来迭代对象。

2
你确定这个能行吗?在 PHP 5.3 上,它会产生 Undefined property: stdClass::$0 的错误,这也是我的经验。 - Matthew
@konforce:我认为我的建议适用于PHP 4,因为Spudley的答案不起作用,我认为这是OP正在使用的版本。 - BoltClock
2
在这种情况下,我会添加类似于 if (version_compare(PHP_VERSION, '5.0.0', '>=')) die('PHP 5 is not supported'); 的内容,或者至少作为注释添加一个大的警告,说明该代码不支持向前兼容。 - Matthew
1
无法确定这是否有效。 这些属性不应该存在; 这可能来自将数组转换为对象,并且您不应尝试在此类对象中访问数值索引属性。 - Lightness Races in Orbit

8

BoltClock建议使用"$data->{'0'}->UserName"似乎不再适用于PHP 5。

我遇到了同样的问题,我发现current()函数可以获取该编号类元素,如下所示...

echo current($data)->UserName;

如果那样不行(取决于对象),您可能需要执行另一个current()调用,如下所示:

echo current(current($data))->UserName;

4

这适用于PHP5以上的版本。

echo $data[0]->UserName;

或者

foreach ($data as $data){
    echo $data->UserName;
    }

或者按照@orrd的建议

current($data)->UserName works great too.

我在思考为什么这个答案没有获得绿色勾选。 - Ajay Kumar

3

你尝试过使用 foreach() 循环吗?这应该会给你所有可访问的元素,并且它返回的键可能会更好地提示你如何直接访问它们。


<b>致命错误</b>:无法将stdClass对象用作数组。 - Ben Guthrie
你使用的是哪个版本的PHP?从PHP5开始,你应该能够在对象上使用foreach。(如果你仍在使用PHP4,你应该升级,因为它已经停止维护超过两年了) - Spudley
+1,因为这在支持的PHP版本上本来就可以工作。这明显是一个PHP 4的情况。 - BoltClock

0

尝试这个:

echo $data[0]['UserName'];

根据手册,对象不应该以那种方式使用。如果您必须这样做,在此页面上的评论提供了一种解决方法。如果您只是用对象来表示属性(而不是行为),也可以简单地依赖于数组。

1
<b>致命错误</b>:无法将stdClass对象用作数组,在<b>file.php</b>的第<b>44</b>行<br /> - Ben Guthrie
我更新了我的回答。简而言之,我认为这不可能直接实现,但可以进行实现。 - pixeline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接