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