0

PHP スクリプトを変更して、JSON オブジェクトを受け取り、その特定の JSON オブジェクトを操作できるようにしようとしています。forループを使用して、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 ループの問題は、$key が整数 (実際の値ではない) であり、$value が「配列」という単語 (実際の値ではない) であることです。

4

3 に答える 3

3

それはまさにそれがすべきことをしています。問題は、あなたがそれを正しく理解していないことです。

「もの」はオブジェクトの配列です。したがって、デコードすると、結果の 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
}
于 2012-04-26T21:46:20.323 に答える
2

もちろん$key整数=)です。[{"widget":"dd"},{"thing":"cc"},{"wcha":"dd"}]これは配列なので、キー = 0 はオブジェクトに対応し、{"widget":"dd"}4 番目になります。

要素にアクセスするには、次を試してください:$value->widgetまたは$value->thing.

スタッフ配列内のすべてのオブジェクトが同じメンバーを持っているわけではないため、オブジェクトを構造化する方法を再考することをお勧めします。

于 2012-04-26T21:45:30.523 に答える
1

JSONを次のように変更します

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

このようにして、ものには構造のような別の辞書が含まれます。

あなたの例では、jsonオブジェクトではなく配列をカプセル化するために使用される [] を使用しているため、あなたが持っている整数は単にアイテムのインデックス {"widget":"dd"}, {"thing":"cc "} と {"wcha":"dd"} を配列に追加します。最初の繰り返しでは、$value["widget"] は "dd" に等しくなければなりません。

于 2012-04-26T21:48:06.350 に答える