【问题标题】:Return PHP object by index number (not name)按索引号(不是名称)返回 PHP 对象
【发布时间】:2011-04-20 13:43:22
【问题描述】:

目标:按数字从 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;

【问题讨论】:

    标签: php object


    【解决方案1】:

    您尝试过foreach() 循环吗?这应该为您提供所有可访问的元素,并且 它返回的键可能会为您提供有关如何直接访问它们的更好线索。

    【讨论】:

    • 致命错误:不能使用 stdClass 类型的对象作为数组
    • 您使用的是什么版本的 PHP?从 PHP5 开始,您应该能够在对象上使用 foreach。 (如果你还在使用 PHP4,你应该升级,因为它已经停产两年多了)
    • +1 因为这无论如何都适用于受支持的 PHP 版本。这里绝对看起来像一个 PHP 4 案例。
    【解决方案2】:

    试试这个:

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

    根据手册,对象不应该以这种方式使用。 cmets on this page 确实提供了一种解决方法,如果这是您的必备品。如果您只是将对象用于属性(而不是行为),您也可以简单地依赖数组。

    【讨论】:

    • 致命错误:不能在 file.php44 上使用 stdClass 类型的对象作为数组
    • 我更新了我的答案。简而言之,我不认为这是开箱即用的,但可以实现。
    【解决方案3】:

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

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

    echo $data->{'0'}->UserName;
    

    我能想到 Spudley 的回答会导致错误的唯一原因是因为您运行的是 PHP 4,它不支持使用 foreach 来迭代对象。

    【讨论】:

    • 你确定这有效吗?在 PHP 5.3 上,它产生 Undefined property: stdClass::$0,这是我的经验。
    • @konforce:我认为我的建议适用于 PHP 4,因为 Spudley 的回答不起作用,所以我认为 OP 正在运行。
    • 在这种情况下,我会添加 if (version_compare(PHP_VERSION, '5.0.0', '>=')) die('PHP 5 is not supported'); 之类的内容,或者至少添加一个大警告作为代码不向前兼容的注释。
    • 这是否有效尚未确定。这些属性不应该存在;它可能来自将数组转换为对象,您不应该尝试访问此类对象中的数字索引属性。
    【解决方案4】:

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

    我遇到了同样的问题,我发现 current() 可以像这样获得编号的类元素...

    echo current($data)->UserName;
    

    或者如果这不起作用(取决于对象),您可能需要像这样进行另一个 current() 调用:

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

    【讨论】:

      【解决方案5】:

      这适用于 PHP5+

      echo $data[0]->UserName;
      

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

      或按照@orrd 的建议

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

      【讨论】:

      • 我在想为什么这个答案没有得到绿色检查
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 2021-06-29
      相关资源
      最近更新 更多