2009-10-14 132 views
5

我努力用PHP解析下面的数据。一个API返回它,并且我尝试了各种语法。如何以非对象的方式返回数据?或者,使用stdClass调用数据的语法是什么?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" 
    } 
    } 
} 
+0

此对象来自哪里? – 2009-10-14 17:18:02

+0

从这个API中,http://emmense.com/sunlight-labs-php-library/ <?php include('class.sunlightlabs.php'); $ sf = new SunlightDistrict; $ sf-> api_key ='[api key]'; echo'

'; print_r($sf->districtsByZipCode(14485)); echo '
'; ?> – ader 2009-10-14 17:20:41

回答

14

他们可能铸造数组对象在他们的代码($object = (object) $array)。这有一个好处,就是从现在开始它将被引用传递(就像对象的默认值一样)以及对象完全无用的缺点(成员不能以数字开头 - 请参阅regex in PHP's docs),直到您将其转换回来(PHP执行允许一些很神秘的东西):

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

啊哈!我曾经遇到类似的问题,就像某人使用诸如'ad-text'这样的XML标签 - 将其加载到SimpleXML对象中,并试图访问'$ ad-> ad-text'不起作用。 – ceejayoz 2009-10-14 17:46:03

+0

This Works!谢谢! – ader 2009-10-14 17:52:46

+5

实际上不需要转换为数组...也可以使用$ object - > {0} - >分区...。 – null 2009-10-14 18:00:29

4

我在看他们的代码现在,不幸的是,他们还没有曝光的选项,其类,以请求数据作为关联数组树VS一个stdClass的对象树。

“问题” 是行96 class.sunlightlabs.php

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在行动

$result = toArray($result); 

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

你可以用自己的类直接通过也行一些创意应用的模式,但他们已经大量使用sublcasses已使其复杂化,所以我坚持这两种解决方案之一。

+2

如果您可以更改json_decode($ data);到json_decode($ data,TRUE);然后该函数将返回一个数组。 – null 2009-10-14 17:58:57

+0

感谢get_object_vars建议,但是,json_decode($ data,TRUE)建议是解决此问题的最佳解决方案。谢谢! – 2010-08-23 06:17:01

+0

同意。 json_decode($ data,TRUE)效果很好! – Suman 2012-05-15 15:00:40

1

你可以通过这样的对象迭代:

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

这工作,但不是我正在寻找。不过谢谢你。 – ader 2009-10-14 17:53:53

+0

我很高兴它有帮助。我并不是想要完全符合你的需求,而是为了回答你的问题,“使用stdClass调用数据的语法是什么?” (以及证明stdClass是可迭代的)。 – GZipp 2009-10-14 19:33:30

10

用途:

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

基本上你的短切分配一个字符串变量,然后使用该变量作为对象访问。

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

这是一个非常酷的黑客,谢谢@null!保存了我的睡眠;) – 2014-07-27 21:42:33

0

这从soulmerge解决方案只是工作对我罚款:

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

非常感谢!

1

用户'null'在评论中提出了这个建议,但是想把它放在这里,所以不会错过。

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