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