stdClass对象问题

时间:2009-10-14 17:10:11

标签: php arrays stdclass

我正在努力使用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"
    }
  }
}

6 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:10)

使用:

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

基本上你是在为一个变量指定字符串,然后使用该变量作为对象访问器。

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

答案 2 :(得分:4)

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

“问题”位于 class.sunlightlabs.php

的第96行
return json_decode( $data );

你有两个选择。

  1. 只需使用stdClass语法。
  2. 将返回的stdClass树转换为关联数组
  3. 行动中的#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;
    }
    

    你也可以通过模式的一些创造性应用直接与他们的班级一起工作,但他们大量使用已经使其复杂化的子语言,所以我坚持这两种解决方案中的一种。

答案 3 :(得分:1)

您可以像这样迭代对象:

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

答案 4 :(得分:1)

用户'null'在评论中提出了这一点,但是想把它放在这里,所以不容错过。

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

答案 5 :(得分:0)