PHPでJSON化した文字列を元のデータに戻すのに使われるのがjson_decode関数です。
これを使っていたらある問題に直面したのでその解決策を書いていきます。
json_decodeを使っていて困ったこと
その問題とは元のデータに戻すときに配列(array)がstdClassに変換されてしまうことです。
例えば例を挙げると次のような感じ
まずPHP内で次のような連想配列を作るとしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$data = array( 'fruits' => array( 'Apple' => 'リンゴ', 'Banana' => 'バナナ', 'Cherry' => 'チェリー', ), 'weekdays' => array( 'Monday' => '月曜日', 'Tuesday' => '火曜日', 'Wednesday' => '水曜日', 'Thursday' => '木曜日', 'Friday' => '金曜日' ) ); |
そしてこれを一旦 json_encode でJSONにしてもう一度 json_decode で戻して中身を表示してみます。
1 2 3 |
$json = json_encode( $data ); $decoded_data = json_decode( $json ); print_r( $decoded_data ); |
するとどのような内容が表示されるかというと次の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
stdClass Object ( [fruits] => stdClass Object ( [Apple] => リンゴ [Banana] => バナナ [Cherry] => チェリー ) [weekdays] => stdClass Object ( [Monday] => 月曜日 [Tuesday] => 火曜日 [Wednesday] => 水曜日 [Thursday] => 木曜日 [Friday] => 金曜日 ) ) |
本来 Array と表示されるべき場所が stdClass になっています。
それでこの stdClass が何者なのかを調べてみると次のような特徴を持つクラスのようです。
- あらかじめ用意されているデフォルトクラス
- プロパティもメソッドも何も持たない
- 存在しないプロパティにもアクセスできる
なぜかググっても公式リファレンスがヒットしませんでしたが、ビルトインクラスです。
当然クラスなので配列とは全く別物です。
存在できないプロパティにアクセスできてしまう上に、 $fruits['Apple'] のように配列的な書き方もできません。
これはどうすればいいのかと悩みましたね。
でも意外とすぐに解決策が見つかりました。
json_decodeの引数にtrueを渡せばいいだけだった
結論から書くとjson_decodeの2番目の引数にtrueを渡すだけで解決しました。
先ほどの例なら次のようにするということです。
1 2 3 |
$json = json_encode( $data ); $decoded_data = json_decode( $json, true ); print_r( $decoded_data ); |
これで次のように stdClass ではなく Array として表示されるようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Array ( [fruits] => Array ( [Apple] => リンゴ [Banana] => バナナ [Cherry] => チェリー ) [weekdays] => Array ( [Monday] => 月曜日 [Tuesday] => 火曜日 [Wednesday] => 水曜日 [Thursday] => 木曜日 [Friday] => 金曜日 ) ) |
やり方さえ分かれば簡単ですが知らないので何時間も悩んでしまいました・・・
悩む前に公式リファレンスなり確認した方がいいですね。
ここまでのまとめ
ここまでのことを簡単にまとめると次の通り
- json_decodeでは Array が stdClass になることがある
- それを防ぐためにはjson_decodeの第二引数にtrueを渡す
これからは第二引数も省略せずに使っていこうと思います。
ではでは( ̄▽ ̄)ノ~~