2012-04-26 104 views
0

我正在尝试更改PHP脚本,以便它可以接收JSON对象并使用给定的JSON对象。一切工作正常,直到我尝试从for循环转换从JSON阵列的对象(又名'东西')。PHP JSON解码

什么我错在这里做:

$json = '{ 

    "foo": "hi", 
    "bar": "bye" 
    "stuff": [{"widget":"dd"},{"thing":"cc"},{"wcha":"dd"}] 
}'; 

$arr = json_decode($json, true); 
$foo = $arr['foo']; //works fine 
$bar = $arr['bar']; //works fine 

//old way that worked: 
//$stuff = array("widget" => "dd", "thing" => "cc", "wcha" => "dd"); 
//new way that does not work: 
$stuff = $arr['stuff']; 
... 

//This is where the problem is: 
foreach ($stuff as $key => $value){... 

在for循环的问题是,$关键是一个整数(不是实际值)和$值是单词“阵列”(不实际值)。

+0

看看你的结构,看看你如何试图访问它。 $ stuff是一个对象数组(或者我认为它将被转换为PHP的一个数组数组)。 – Corbin 2012-04-26 21:45:38

+0

你的JSON解码给我NULL(没有什么工作正常):http://codepad.org/meAoAn0a – hakre 2012-04-26 22:28:59

回答

3

它正在做它应该做的。问题是你不太理解它。

“stuff”是一组对象。所以,当你对其进行解码,得到的PHP数组是这样的:

[stuff]=> 
array(3) 
    { 
    [0]=> 
    array(1) 
    { 
    [widget]=>string(2) "dd" 
    } 
    [1]=> 
    array(1) 
    { 
    [thing]=>string(2) "cc" 
    } 
    [2]=> 
    array(1) 
    { 
    [wcha]=>string(2) "dd" 
    } 
    } 

所以,当你调用它foreach,你从那里获得单独的阵列。

我想你的JSON应该是:

"stuff": {"widget":"dd","thing":"cc","wcha":"dd"} 

要么,你的PHP代码应该是:

foreach($stuff as $element) { 
    list($key,$value) = each($element); 
    // now do stuff 
} 
2

当然$key是一个整数=)。 [{"widget":"dd"},{"thing":"cc"},{"wcha":"dd"}]这是你的数组,所以key = 0对应于对象{"widget":"dd"}等等第四。

要找到元素,请尝试:$value->widget$value->thing

由于stuff数组中的对象并不都具有相同的成员,所以您可能希望重新考虑构造对象的方式。

1

更改您的JSON到

$json = '{ 
    "foo": "hi", 
    "bar": "bye" 
    "stuff": {"widget":"dd", 
      "thing":"cc", 
      "wcha":"dd"} 
}'; 

这样的东西包含另一个字典像结构。

在你的例子中,你使用[]谁来封装一个数组,而不是一个json对象,因此你所拥有的整数只是项目的索引{“widget”:“dd”},{“thing “:”cc“}和{”wcha“:”dd“}。对于你的第一次迭代$ value [“widget”]应该等于“dd”。