今回はPHPで配列をJSONに変換して出力したり、JSONデータを読み込んで配列にする方法です。
JSONというのは、JavaScript Object Notationの略で、テキストのデータです。
といっても最近ではJavaScriptのためのデータではなく、PHPなどでも幅広く使われています。
JSONという形式はXMLに似ててXMLを簡易的にした感じです。(だと僕は思ってます。)
XMLはタグ(キー)と値の組み合わせで、PHPで言う連想配列の作りに当てはまります。
配列をCSVに出力する方法だと連想配列のキーが無くなってしまいます。
配列をDBやファイルに出力して保持したい場合に、キーも保持したいならJSONがいいですね。
PHPの連想配列をJSONデータに変換する方法
PHPの配列をJOSN形式のデータに変換するには json_encode() を使います。
[aside type=”normal”]json_encode($配列, $オプション)[/aside]
$配列は、JSONに出力するデータです。連想配列も多次元配列も対応します。
$オプションは、出力形式などを指定できます。
戻り値は、JSON形式に変換されたデータが取得できます。
実際にJSON形式に変換してみましょう。
$ary = array(
array('A', 23, '北海道,青森', '我輩は"猫"である。'),
array('B', 23, '沖縄', "我輩は'猫'である。"),
array('name' => 'C', 'age' => 23, 'from' => '東京,埼玉,千葉', "word" => 'ぼっちゃん'),
);
$json = json_encode($ary);
var_dump($json);
これを実行すると、以下のように出力されます。
string(286) "[["A",23,"\u5317\u6d77\u9053,\u9752\u68ee","\u6211\u8f29\u306f\"\u732b\"\u3067\u3042\u308b\u3002"],["B",23,"\u6c96\u7e04","\u6211\u8f29\u306f'\u732b'\u3067\u3042\u308b\u3002"],{"name":"C","age":23,"from":"\u6771\u4eac,\u57fc\u7389,\u5343\u8449","word":"\u307c\u3063\u3061\u3083\u3093"}]"
ぱっと見分かりにくいですが、日本語部分はユニコードに変換されてしまいます。
これでも問題無く、再度読み込んだときには見て読める日本語になります。
気になる方は、json_encodeの第2引数のオプションに JSON_UNESCAPED_UNICODE を指定すると日本語になります。
$ary = array(
array('A', 23, '北海道,青森', '我輩は"猫"である。'),
array('B', 23, '沖縄', "我輩は'猫'である。"),
array('name' => 'C', 'age' => 23, 'from' => '東京,埼玉,千葉', "word" => 'ぼっちゃん'),
);
$json = json_encode($ary, JSON_UNESCAPED_UNICODE);
var_dump($json);
//出力結果
//string(184) "[["A",23,"北海道,青森","我輩は\"猫\"である。"],["B",23,"沖縄","我輩は'猫'である。"],{"name":"C","age":23,"from":"東京,埼玉,千葉","word":"ぼっちゃん"}]"
日本語で表示され見やすくなりました。
ダブルクォーテーションや文字列内のカンマなども正しく変換してくれています。
一応補足ですが、出力結果は通常は1行で出力されます。
これを階層構造で出力するためには JSON_PRETTY_PRINT もオプションに指定してやります。
日本語のオプションも同時に指定したい場合は | を区切りにして複数指定することができます。
$ary = array(
array('A', 23, '北海道,青森', '我輩は"猫"である。'),
array('B', 23, '沖縄', "我輩は'猫'である。"),
array('name' => 'C', 'age' => 23, 'from' => '東京,埼玉,千葉', "word" => 'ぼっちゃん'),
);
$json = json_encode($ary, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
var_dump($json);
// 出力結果
string(327) "[
[
"A",
23,
"北海道,青森",
"我輩は\"猫\"である。"
],
[
"B",
23,
"沖縄",
"我輩は'猫'である。"
],
{
"name": "C",
"age": 23,
"from": "東京,埼玉,千葉",
"word": "ぼっちゃん"
}
]"
次はこれを読み込んで元の連想配列を作成します。
JSONを読み込み連想配列にする方法
JSONデータを読み込み配列にするには、json_decode() を使います。
[aside type=”normal”]$配列 = json_decode($JSONデータ, true)[/aside]
$JSONデータは、配列に変換する元のJSONデータです。
第2引数の true は、連想配列で返す場合に指定します。この指定が無いと、キーを持つデータはオブジェクトに変換されます。
戻り値の$配列は、変換後の配列です。
実際に動かしてみます。
JSONはテキストデータなので文字列で定義することができます。
今回は配列をJSONに変換し、そのJSONを再度配列に変換する流れで行います。
$ary = array(
array('A', 23, '北海道,青森', '我輩は"猫"である。'),
array('B', 23, '沖縄', "我輩は'猫'である。"),
array('name' => 'C', 'age' => 23, 'from' => '東京,埼玉,千葉', "word" => 'ぼっちゃん'),
);
$json = json_encode($ary, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
$ary2 = json_decode($json, true);
var_dump($ary2);
実行結果は次のようになります。
array(3) {
[0]=>
array(4) {
[0]=>
string(1) "A"
[1]=>
int(23)
[2]=>
string(16) "北海道,青森"
[3]=>
string(26) "我輩は"猫"である。"
}
[1]=>
array(4) {
[0]=>
string(1) "B"
[1]=>
int(23)
[2]=>
string(6) "沖縄"
[3]=>
string(26) "我輩は'猫'である。"
}
[2]=>
array(4) {
["name"]=>
string(1) "C"
["age"]=>
int(23)
["from"]=>
string(20) "東京,埼玉,千葉"
["word"]=>
string(15) "ぼっちゃん"
}
}
ちゃんと値の中にカンマやダブルクォーテーションがある場合も、1つの配列の要素として処理できています。
連想配列でキーを持っていたものは、キーもちゃんと復元されています。
まとめ
配列をJSONに変換するにはjson_encode()を使う。
JSONを配列に変換するにはjson_decode()を使う。
json_encode()は、見て分かる日本語にするには、第2引数のオプションに JSON_UNESCAPED_UNICODE を設定する。
出力時に整形させたい場合は JSON_PRETTY_PRINT をオプションに指定する。
json_decode() は第2引数に true を指定しないと、キーを持つ要素がオブジェクト形式になってしまう。
true を指定すれば連想配列になる。










コメント