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をセットすると変換後のデータは配列になります。
意外と知られていないんです。
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から必要な値だけを配列にする必要はありません。
作法やルール的にはどちらを使っても問題ありません。
オブジェクトからループさせて配列に変換していた方はぜひ使ってみてください。