この例の助けを借りて、1つのオブジェクトでJSON文字列をデコードする方法を知っています JSON文字列をデコードする方法
しかし、いくつかのオブジェクトを含むJSON文字列のデコードを改善したいのですが、どうすればよいのか理解できません。
次に例を示します。
{ "inbox": [
{ "firstName": "Brett", "lastName":"McLaughlin" },
{ "firstName": "Jason", "lastName":"Hunter" },
{ "firstName": "Elliotte", "lastName":"Harold" }
],
"sent": [
{ "firstName": "Isaac", "lastName": "Asimov" },
{ "firstName": "Tad", "lastName": "Williams" },
{ "firstName": "Frank", "lastName": "Peretti" }
],
"draft": [
{ "firstName": "Eric", "lastName": "Clapton" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff" }
]
}
改訂された質問について:foreach
は実際には、プロパティと、多数の値を持つアイテム(配列)で機能します 詳細はこちら 。たとえば、質問にJSON文字列を使用すると、次のようになります。
$data = json_decode($json);
foreach ($data as $name => $value) {
// This will loop three times:
// $name = inbox
// $name = sent
// $name = draft
// ...with $value as the value of that property
}
プロパティのメインループ内で、内部ループを使用して、各プロパティが指す配列エントリを調べることができます。たとえば、トップレベルの各プロパティに配列値があり、各配列エントリに「firstName」プロパティがあることを知っている場合、このコードは次のようになります。
$data = json_decode($json);
foreach ($data as $name => $value) {
echo $name . ':'
foreach ($value as $entry) {
echo ' ' . $entry->firstName;
}
}
...表示されます:
受信トレイ: ブレット ジェイソン エリオット 送信: アイザック タッド フランク 下書き: エリック セルゲイ
編集を開始コメントを再入力:
次に、いくつかのオブジェクトでJSON文字列をデコードする方法を知りたいのですが。
投稿した例doesには複数のオブジェクトがあり、それらはすべて1つのラッパーオブジェクトに含まれています。これは [〜#〜] json [〜#〜] の要件です。 (たとえば)これを行うことはできません。
{"name": "I'm the first object"},
{"name": "I'm the second object"}
そのJSONは無効です。そこにが単一の最上位オブジェクトであるがあります。それは単に配列を含むかもしれません:
{"objects": [
{"name": "I'm the first object"},
{"name": "I'm the second object"}
]}
...またはもちろん、個々のオブジェクトに名前を付けることができます:
{
"obj0": {"name": "I'm the first object"},
"obj1": {"name": "I'm the second object"}
}
編集の終了
あなたの例は、3つのプロパティを含む1つのオブジェクトであり、それぞれの値はオブジェクトの配列です。実際、これは、リンクした質問の例(配列値を持つプロパティを持つオブジェクトも含む)とそれほど変わりません。
そう:
$data = json_decode($json);
foreach ($data->programmers as $programmer) {
// ...use $programmer for something...
}
foreach ($data->authors as $author) {
// ...use $author for something...
}
foreach ($data->musicians as $musician) {
// ...use $musician for something...
}
json_decode
JSON文字列をデコードする関数:
$json = <<<JSON
{ "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin" },
{ "firstName": "Jason", "lastName":"Hunter" },
{ "firstName": "Elliotte", "lastName":"Harold" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov" },
{ "firstName": "Tad", "lastName": "Williams" },
{ "firstName": "Frank", "lastName": "Peretti" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff" }
]
}
JSON;
$data = json_decode($json);
次に、データがどのように見えるかを確認するには、データをダンプします。
var_dump($data);
さらに、3つの配列を含むオブジェクトがあり、それぞれに他のサブオブジェクトが含まれていることがわかります。
object(stdClass)[1]
public 'programmers' =>
array
0 =>
object(stdClass)[2]
public 'firstName' => string 'Brett' (length=5)
public 'lastName' => string 'McLaughlin' (length=10)
1 =>
object(stdClass)[3]
public 'firstName' => string 'Jason' (length=5)
public 'lastName' => string 'Hunter' (length=6)
...
public 'authors' =>
array
0 =>
object(stdClass)[5]
public 'firstName' => string 'Isaac' (length=5)
public 'lastName' => string 'Asimov' (length=6)
...
つまり、データへのアクセス方法を知っています。
たとえば、プログラマーのリストを表示するには、次を使用できます。
foreach ($data->programmers as $programmer) {
echo $programmer->firstName . ' ' . $programmer->lastName . '<br />';
}
次の出力が得られるでしょう:
Brett McLaughlin
Jason Hunter
Elliotte Harold