web-dev-qa-db-ja.com

PHPで複数のオブジェクトを含むJSON文字列をデコードする方法は?

この例の助けを借りて、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" }
 ]
}
  1. 上記のJSON文字列をデコードするためのforeach()を1つだけ作成する方法は?
  2. オブジェクトの名前を検出する方法:このforeach()の受信トレイ、送信済み、または下書き?
17
ilnur777

新しい答え

改訂された質問について: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...
}
27
T.J. Crowder

json_decodeJSON文字列をデコードする関数:

$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
8
Pascal MARTIN