現役プログラマのWordPressカスタマイズ相談

WordPress(ワードプレス)のお悩み、うまくいかなくてお困りなこと、不具合調査、新規制作依頼まで、ウェブアプリケーションエンジニアがあなたをサポートします。

JSONデコードの第二引数

通常、json_decode()を使うと結果はstdClass(オブジェクト)になります。


今日のJSONデータサンプルは、WBC強化試合[侍ジャパンCPBL選抜チャイニーズ・タイペイ]の日本の先発メンバーです。

{"1":{"position":"DesignatedHitter","name":"\u5c71\u7530"},"2":{"position":"SecondBaseman","name":"\u83ca\u6c60"},"3":{"position":"ShortStop","name":"\u5742\u672c"},"4":{"position":"LeftFielder","name":"\u7b52\u9999"},"5":{"position":"FirstBaseman","name":"\u4e2d\u7530"},"6":{"position":"RightFielder","name":"\u5e73\u7530"},"7":{"position":"ThirdBaseman","name":"\u677e\u7530"},"8":{"position":"Catcher","name":"\u5c0f\u6797"},"9":{"position":"CenterFielder","name":"\u79cb\u5c71"}}

アサヒスーパードライ プレゼンツ 侍ジャパン壮行試合 侍ジャパン 対 CPBL選抜チャイニーズ・タイペイ 第1戦|トップチーム|野球日本代表 侍ジャパンオフィシャルサイト

json_decodeの第二引数

json_decodeにJSONデータをセットして変換する人は多いと思います。
なんで「->」を使って値を取得するのだろう(中には面倒だな)と感じる方もいらっしゃるはずです。

知ってる人は知ってるのですが、
第二引数にtrueをセットすると変換後のデータは配列になります。
意外と知られていないんです。

PHP: json_decode - Manual

json_decode false(第二引数なし)

<?php
//JSONデータ
$json_data = '{"1":{"position":"DesignatedHitter","name":"\u5c71\u7530"},"2":{"position":"SecondBaseman","name":"\u83ca\u6c60"},"3":{"position":"ShortStop","name":"\u5742\u672c"},"4":{"position":"LeftFielder","name":"\u7b52\u9999"},"5":{"position":"FirstBaseman","name":"\u4e2d\u7530"},"6":{"position":"RightFielder","name":"\u5e73\u7530"},"7":{"position":"ThirdBaseman","name":"\u677e\u7530"},"8":{"position":"Catcher","name":"\u5c0f\u6797"},"9":{"position":"CenterFielder","name":"\u79cb\u5c71"}}';
//デコード引数なし
$dec1 = json_decode($json_data);
//確認
var_dump($d1);

これを実行すると

$ php -q json.php
/home/ubuntu/workspace/test/json.php:18:
class stdClass#1 (9) {
  public $1 =>
  class stdClass#2 (2) {
    public $position =>
    string(16) "DesignatedHitter"
    public $name =>
    string(6) "山田"
  }
  public $2 =>
  class stdClass#3 (2) {
    public $position =>
    string(13) "SecondBaseman"
    public $name =>
    string(6) "菊池"
  }
  public $3 =>
  class stdClass#4 (2) {
    public $position =>
    string(9) "ShortStop"
    public $name =>
    string(6) "坂本"
  }
  public $4 =>
  class stdClass#5 (2) {
    public $position =>
    string(11) "LeftFielder"
    public $name =>
    string(6) "筒香"
  }
  public $5 =>
  class stdClass#6 (2) {
    public $position =>
    string(12) "FirstBaseman"
    public $name =>
    string(6) "中田"
  }
  public $6 =>
  class stdClass#7 (2) {
    public $position =>
    string(12) "RightFielder"
    public $name =>
    string(6) "平田"
  }
  public $7 =>
  class stdClass#8 (2) {
    public $position =>
    string(12) "ThirdBaseman"
    public $name =>
    string(6) "松田"
  }
  public $8 =>
  class stdClass#9 (2) {
    public $position =>
    string(7) "Catcher"
    public $name =>
    string(6) "小林"
  }
  public $9 =>
  class stdClass#10 (2) {
    public $position =>
    string(13) "CenterFielder"
    public $name =>
    string(6) "秋山"
  }
}

json_decode false(第二引数あり true)

<?php
//デコード引数true
$dec1 = json_decode($json_data, true);
//確認
var_dump($d1);

trueを引数に入れて再度実行してみます。

$ php -q json.php
/home/ubuntu/workspace/test/json.php:18:
array(9) {
  [1] =>
  array(2) {
    'position' =>
    string(16) "DesignatedHitter"
    'name' =>
    string(6) "山田"
  }
  [2] =>
  array(2) {
    'position' =>
    string(13) "SecondBaseman"
    'name' =>
    string(6) "菊池"
  }
  [3] =>
  array(2) {
    'position' =>
    string(9) "ShortStop"
    'name' =>
    string(6) "坂本"
  }
  [4] =>
  array(2) {
    'position' =>
    string(11) "LeftFielder"
    'name' =>
    string(6) "筒香"
  }
  [5] =>
  array(2) {
    'position' =>
    string(12) "FirstBaseman"
    'name' =>
    string(6) "中田"
  }
  [6] =>
  array(2) {
    'position' =>
    string(12) "RightFielder"
    'name' =>
    string(6) "平田"
  }
  [7] =>
  array(2) {
    'position' =>
    string(12) "ThirdBaseman"
    'name' =>
    string(6) "松田"
  }
  [8] =>
  array(2) {
    'position' =>
    string(7) "Catcher"
    'name' =>
    string(6) "小林"
  }
  [9] =>
  array(2) {
    'position' =>
    string(13) "CenterFielder"
    'name' =>
    string(6) "秋山"
  }
}

PHPは配列の方が馴染みがある気がします。

それにしてもWBC2017のメンバーは〇田という名前の選手が多いですね。
試合は今日も負けてしまいましたが、本番はきっと万全の力を発揮してくれることでしょう!

ソフトバンクでメジャー表明して退団したヤンヤオシュンがピッチャーからバッターに変わって台湾で活躍していることに一番驚きました(笑)



json_decodeですが、この方法を使えばいちいちstdClassから必要な値だけを配列にする必要はありません。

作法やルール的にはどちらを使っても問題ありません。
オブジェクトからループさせて配列に変換していた方はぜひ使ってみてください。