问题:stdClass对象问题

5

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

这个对象是从哪里来的? - Ivan Nevostruev
从这个API,http://emmense.com/sunlight-labs-php-library/<?php include('class.sunlightlabs.php'); $sf = new SunlightDistrict; $sf->api_key = '[api key]'; echo '<pre>'; print_r( $sf->districtsByZipCode( 14485 ) ); echo '</pre>'; ?> - ader
6个回答

14

他们可能在代码中将数组转换为对象($object = (object) $array)。这样做的优点是它从现在开始将以引用方式传递(与对象的默认方式相同),缺点是该对象完全无用(成员不能以数字开头 - 参见PHP文档中的正则表达式),直到您将其转换回来(PHP确实允许一些非常神秘的事情):

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

啊哈!我曾经遇到过一个类似的问题,有人使用XML标签像ad-text,将其加载到SimpleXML对象中并尝试访问$ad->ad-text是不起作用的。 - ceejayoz
5
其实不需要将其转换为数组...也可以使用$object->{0}->district...的方式。 - null

10

使用:

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

基本上,您是将字符串赋值给变量,然后使用该变量作为对象访问器的快捷方式。

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

4

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

“问题”出现在class.sunlightlabs.php的第96行。

return json_decode( $data );

你有几个选择。

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

示例1:

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

#2 in action

$result = toArray( $result );

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

你也可以通过一些创意模式直接使用它们的类,但是因为它们已经大量使用了子类,这会使得这种方式变得更加复杂,所以我建议你使用这两种解决方案中的一种。

2
如果你将 json_decode( $data ); 改为 json_decode( $data, TRUE ); 那么该函数将返回一个数组。 - null
感谢您提供的get_object_vars建议,它确实有效。然而,json_decode($data, TRUE)建议是解决此问题的最佳方法。谢谢! - William Denniss

1
您可以像这样遍历对象:
foreach ($obj as $each) {
    echo $each->district->state . ' - ' . $each->district->number . '<br />';
}

这个可以用,但不完全符合我的要求。还是谢谢你。 - ader
我很高兴它能帮到你。我并不是试图完全匹配你的需求,而是希望回答你的问题:“使用stdClass调用数据的语法是什么?”(同时演示stdClass是可迭代的)。 - GZipp

1
用户“null”在评论中提出了这个建议,但是我想把它放在这里,以便不会被轻易忽略。
最好的选择是将TRUE作为json_decode的第二个参数传递,即json_decode($data, TRUE),这将使其返回关联数组而不是类。因此,如果您可以访问源代码,请进行更改。

0

这个来自soulmerge的解决方案对我很有效:

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

非常感谢!!


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