[PHP]json_decode した stdClass Object を扱う

Facebook にシェア
Delicious にシェア
LINEで送る
Pocket

stdClass Object
(
    ["sample"] => stdClass Object
        (
            ["color"] => red
        )

    ["0"] => stdClass Object
        (
            ["color"] => green
        )

)

json_decode をすると第2引数を指定しない限り上のようになることがあります。
sample の color を取り出すなら、「$foo->sample->color」で良いのですが、
[0] のほうを取り出そうとして「$foo->0->color」とやってもエラーになります。
かといって $foo->item(0) みたいなものがあるわけでもないようなので、
素直に Array にキャストするのが普通ですが、もし強引にそのまま扱いたいのであれば

$foo->{'0'}->color

のようにすればとりあえず取れます。

とは言え扱いにくいので json_decode($foo, true) として連想配列にしておいたほうがいいと思います。


2012/11/24 追記:
この方法はキーがString型の場合のみ使用できます。


Similar Posts:




  • This entry was posted in PHP and tagged , . Bookmark the permalink.

    2 Responses to [PHP]json_decode した stdClass Object を扱う

    1. CertaiN says:

      PHPのバージョンはどうなっていますでしょうか?

      PHP5での挙動を確認したところ、プロパティ名がString型ではない場合に{'property'}の形式が使えないようでした。
      PHP4では正常に動作していました。

      この仕様変更どうなんでしょうね・・・

    2. PHP-Archive says:
      <?php
      //PHP 5.4.7
      $array = array(
        "sample" => array("color" => "red"),
        array("color" => "green")
      );
      
      $encoded = json_encode($array);
      $decoded = json_decode($encoded);
      
      echo $decoded->{'0'}->color;
      //結果「green」
      

      コメントありがとうございます。
      一応上記ソースでPHP 5.4.7および5.3.6での動作を確認できました。

      json_encodeの特性上、数字以外のキー名を含む配列をエンコードした場合、すべてのキーがString型に変換されるため、エラーは発生しませんが、配列のすべてのキーが数字の場合int型として変換されるため、この方法は使えないことになります。

      json_encodeを行う際、「json_encode($array, JSON_FORCE_OBJECT)」としておくことで回避する方法もあると思います。

    コメントを残す

    メールアドレスが公開されることはありません。