PHPでJSONデータの取得の仕方

#はじめに

この記事は私のサイト『[FantmSite](http://fantmsite.com/)』のブログでこう書いていたのですが、心機一転としてブログを閉鎖し、今後サイトをリニューアルすべくその一つとしてQiitaに移転させています。

#記事の内容

## はじめに
最近開発をせずに勉強ばかりしているので書く内容がなかなかないのですが、「[【PHP】MySQLに保存しているデータをJSONで吐き出す](http://qiita.com/fantm21/items/891192da1a095e94c9e1)」という記事は書いたのに、JSONの読み取りについて書いていなかったので、記述しておきたいと思います。
##JSONデータの例
説明を行うために、まず今回利用するJSONデータの例を示しておきます。

```json:jsondata.json
{"res":
	{"blogData":[
		{
			"id":"0001",
			"title":"サンプル01",
			"day":[
				{
					"year":"2015",
					"month":"03",
					"_day":"31"
				}
			],
			"author":"fantmsite",
			"tag":[
				"ブログ"
			],
			"report":"ブログ内容サンプル01"
		},
		{
			"id":"0002",
			"title":"サンプル02",
			"day":[
				{
					"year":"2015",
					"month":"04",
					"_day":"01"
				}
			],
			"author":"fantmsite",
			"tag":[
				"ブログ"
			],
			"report":"ブログ内容サンプル02"
		}
	]}
}
```
このデータはブログなどに活用出来るようにしてみました。
JSONデータの取得
では、PHP側に移ります。まずJSONデータを取得するために、JSONデータがおかれているところにアクセスしないといけないので、

```php:
$url = "http://sample.com/jsondata.json";
```

のように**`$url`**という変数を準備してあげて、JSONデータの置かれているURL先を格納してあげます。( `http://sample.com/` のところはご自身の環境に対応して変えてください。)
次に、JSONデータを全て文字列に読み込むために、**`$json`**という変数を作ってあげて以下のように記述します。

```php:
$json = file_get_contents($url);
```

この**`file_get_contents`**についての説明はPHPの公式ドキュメントを下記に引用しておきます。

>この関数は file() と似ていますが、 offset で指定した場所から開始し maxlen バイト分だけ ファイルの内容を文字列に読み込むという点が異なります。 失敗した場合、file_get_contents() は FALSE を返します。
file_get_contents()はファイルの内容を文字列に読み込む 方法として好ましいものです。もしOSがサポートしていれば パフォーマンス向上のためにメモリマッピング技術が使用されます。
（『[http://php.net/manual/ja/function.file-get-contents.php](http://php.net/manual/ja/function.file-get-contents.php)』より）

---

次に、読み取ったJSONデータを表示するときに文字化けしないように次のように記述します。

```php:
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
```

**`mb_convert_encoding()`**というのを使います。これは、ASCII,JIS,UTF-8,EUC-JP,SJIS-WINの順番で自動検出し、UTF8に変換するということです。
私の下手な説明よりも、詳しくはPHPのドキュメントで確認してください。([http://php.net/manual/ja/function.mb-convert-encoding.php](http://php.net/manual/ja/function.mb-convert-encoding.php))
ただし、**`auto`**を使ったやり方はしないほうが無難ぽいので、使わないでください。

**参考**

* [mb_convert_encodingのautoが危険な理由](http://qiita.com/shoyan/items/d9f7c014ba8003e19b57)

---

次に、JSONデータを連想配列にします。

```php:
$arr = json_decode($json,true);
```

上のコードを見てもらうとわかるように、**`true`**というのが第二引数で書かれています。これはなくても**`json_decode()`**の役割は果たせるのですが、**`true`**がないと連想配列にはなりません。

##サンプル

```php:
// stdClassのメンバへアクセス方法
$arr = json_decode($json);
echo $arr->res->blogData->id;
 
// 連想配列へのアクセス方法
$arr = json_decode($json, true);
echo $arr['res']['blogData']['id'];
```

ちなみに**`stdClass`**とは、

>オブジェクトへの型変換で作られる

ものです。([php公式ドキュメント](http://php.net/manual/ja/reserved.classes.php)より)

はい、これで連想配列に持ち込めたので、あとは存在するかどうかを確認(ファイルはあっても読み込めないデータとかなんかデータが入っていなかったりとかを確認)して、変数に入れるだけで終わりです。

##確認方法

```php:
if ($arr === NULL) {
    return;//〜データがない時の処理〜
}else{
    //〜存在しているときの処理〜
}
```

**`$arr`**は上記で示している**`json_decode($json,true)`**が格納されている**`$arr`**です。
それで、あとは変数を準備して次にように記述。

```php:
$bc_id = $arr["res"]["blogData"][0]["id"];
```

[0]とは、**`blogData`**には上記のJSONデータでは2つあるので、[0]と[1]でどっちを指しているのかを示してあげる必要があるからです。

##全体

では、最後に全てのコードを。

```php:
<?php
$url = "http://sample.com/jsondata.json";
$json = file_get_contents($url);
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$arr = json_decode($json,true);
 
if ($arr === NULL) {
        return;
}else{
        $json_count = count($arr["res"]["blogData"]);
        $bc_id　= array();
        $bc_title = array();
        $bc_write_day_year = array();
        $bc_write_day_month = array();
        $bc_write_day_day = array();
        $bc_author = array();
        $bc_tag = array();
        $bc_report = array();
        for($i=$json_count-1;$i>=0;$i--){
            $bc_id[] = $arr["res"]["blogData"][$i]["id"];
            $bc_title[] = $arr["res"]["blogData"][$i]["title"];
            $bc_write_day_year[] = $arr["res"]["blogData"][$i]["day"][0]["year"];
            $bc_write_day_month[] = $arr["res"]["blogData"][$i]["day"][0]["month"];
            $bc_write_day_day[] = $arr["res"]["blogData"][$i]["day"][0]["_day"];
            $bc_author[] = $arr["res"]["blogData"][$i]["author"];
            $bc_tag[] = $arr["res"]["blogData"][$i]["tag"][0];
            $bc_report[] = $arr["res"]["blogData"][$i]["report"];
        }
     
}
```

何か問題などありましたら気軽にコメントください。
また、間違った説明などございましたらご教授のほどお願いいたします。