【问题标题】:stdClass Object problemsstdClass 对象问题
【发布时间】:2010-12-06 18:21:08
【问题描述】:

我正在努力使用 PHP 解析以下数据。 API 返回它,我尝试了各种语法。如何以非对象方式返回数据?或者,使用 stdClass 调用数据的语法是什么?

我可以将其转换为一个基于数据的数组,甚至两个吗?当谈到基于对象的数据集时,我迷失了方向。

stdClass Object
(
    [0] => stdClass Object
        (
            [district] => stdClass Object
                (
                    [state] => NY
                    [number] => 29
                )

        )

    [1] => stdClass Object
        (
            [district] => stdClass Object
                (
                    [state] => NY
                    [number] => 26
                )

        )

)

当我自己创建对象,然后执行 var_dump 时,我得到了:

object(stdClass)#8 (2) {
  [0]=>
  object(stdClass)#4 (1) {
    ["district"]=>
    object(stdClass)#5 (2) {
      ["state"]=>
      string(2) "NY"
      ["number"]=>
      string(2) "29"
    }
  }
  [1]=>
  object(stdClass)#6 (1) {
    ["district"]=>
    object(stdClass)#7 (2) {
      ["state"]=>
      string(2) "NY"
      ["number"]=>
      string(2) "26"
    }
  }
}

【问题讨论】:

标签: php arrays stdclass


【解决方案1】:

他们可能将数组转换为代码中的对象 ($object = (object) $array)。这样做的好处是它将从现在开始通过引用传递(就像对象的默认设置一样)和对象完全无用的缺点(成员不能以数字开头 - 请参阅regex in PHP's docs),直到您将其转换回( PHP 确实允许一些非常神秘的东西):

$array = (array) $bogusObject;
$array[0]->district->state === 'NY';

【讨论】:

  • 啊哈!曾经有人使用像 ad-text 这样的 XML 标签时遇到过类似的问题 - 将其加载到 SimpleXML 对象中并尝试访问 $ad->ad-text 不起作用。
  • 其实不用强制转换成数组...也可以使用$object->{0}->district...。
【解决方案2】:

我现在正在查看他们的代码,不幸的是,他们没有在他们的类中公开选项让您将数据请求为关联数组树与 stdClass 对象树。

“问题”在 class.sunlightlabs.php

的第 96 行
return json_decode( $data );

你有几个选择。

  1. 只需使用 stdClass 语法。
  2. 将返回的 stdClass 树转换为关联数组 one

#1 在行动

// echo the state of the 2nd object in the result
echo $result->{0}->district->state;

#2 在行动

$result = toArray( $result );

function toArray( $data )
{
  if ( is_object( $data ) )
  {
    $data = get_object_vars( $data );
  }
  return is_array($data) ? array_map(__FUNCTION__, $data) : $data;
}

您也可以通过一些创造性的模式应用直接使用他们的课程,但是他们已经大量使用子类,这使得它相当复杂,所以我会坚持这两种解决方案之一。

【讨论】:

  • 如果可以改变 json_decode( $data );到 json_decode($data, TRUE);然后该函数将返回一个数组。
  • 感谢 get_object_vars 建议有效,但是 json_decode($data, TRUE) 建议是解决此问题的最佳方法。谢谢!
【解决方案3】:

你可以像这样遍历对象:

foreach ($obj as $each) {
    echo $each->district->state . ' - ' . $each->district->number . '<br />';
}

【讨论】:

  • 这行得通,但不是我想要的。不过,谢谢。
  • 我很高兴它有帮助。我并没有试图完全满足您的需求,而是帮助回答您的问题,“使用 stdClass 调用数据的语法是什么?” (以及证明 stdClass 是可迭代的)。
【解决方案4】:

用途:

$object->{'0'}->district->state

基本上,您是将字符串分配给变量的捷径,然后将该变量用作对象访问器。

$zero = "0";
$object->$zero; /* or */ $object->{$zero};

【讨论】:

    【解决方案5】:

    soulmerge 的这个解决方案对我来说效果很好:

    $array = (array) $bogusObject;
    $array[0]->district->state === 'NY';
    

    非常感谢!!

    【讨论】:

      【解决方案6】:

      用户 'null' 在 cmets 中提出了这个建议,但想把它放在这里,这样就不会那么容易错过了。

      最好的选择是将 TRUE 作为 json_decode 中的第二个参数传递,即 json_decode($data, TRUE) 这使它返回关联数组而不是类。因此,如果您可以访问源代码,请进行更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-22
        • 2010-11-22
        • 2010-12-09
        • 2011-08-31
        • 2013-10-17
        • 2014-10-17
        • 1970-01-01
        相关资源
        最近更新 更多