【PHP】json,txtファイルに連想配列を読み込み・書き込みする方法


#【PHP】json,txtファイルに連想配列を読み込み・書き込みする方法
本記事で使用する関数について簡単に説明します。

本記事に間違いなどあれば修正します。

* **file_put_contents**
 ファイルにデータを書き込む関数。
  fopen()、fwrite()、fclose() を使ってファイルに書き込むのと同じ。
  
* **file_get_contents**
  ファイルの内容を読み込む関数。
  
* **mb_convert_encoding**
  文字化け回避、文字コードの変換。

* **json_encode**
  値を JSON 形式にして返す。

* **json_decode**
  JSON文字列を適切なPHPの型にして戻す。
<br>

ファイルに書き込むための連想配列を用意しました。

```php:PHP
<?php
  $fruits = array(
    array("果物"=>"イチゴ","color"=>"red"),
    array("果物"=>"レモン","color"=>"yellow"),
    array("果物"=>"リンゴ","color"=>"red")
  );
?>
```
##JSONファイルへの書き込み、読み込み

```php:PHP
<?php
  $json_filename = "./test.json";
  file_put_contents($json_filename,json_encode($fruits));

  $json_file = file_get_contents($json_filename);
  function print_json($json_file) {
    header("Content-Type: application/json; charset=utf-8");
    $json_file = mb_convert_encoding($json_file, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
  }

  var_dump(json_decode($json_file,true));
?>
```
**解説**
一行目はファイルのパスを指定してるだけ。

```
$json_filename = "./test.json";
```

二行目では、```file_put_contents()```と```json_encode()```を使用してjson形式に変更した連想配列を先ほど指定したパスに書き込んでいきます。書き込みは一行でできます。
フラグのところには、以下のフラグを挿入することが可能です。複数指定する場合は｜で下記のように指定してください。
```file_put_cintents( パス , json_encode( 変数 ), FILE_APPEND | LOCK_EX );```

| フラグ | 説明 |
|:-:|:-:|
| **FILE_USE_INCLUDE_PATH** |  ファイルをインクルードディレクトリから探す。 |
| **FILE_APPEND** | 指定したファイルが、すでに存在する場合に、データをファイルに追記します。<br>※上書きではありません。 |
| **LOCK_EX** | 他の人が同時にファイルに書き込めないようにします。 |

参考：https://www.php.net/manual/ja/function.file-put-contents.php

```
file_put_contents($json_filename,json_encode($fruits));
```
ここからは読み込みです。```file_get_contents()```を使いjsonの中身を取得しています。

```
$json_file = file_get_contents($json_filename);
```

下記のように```header()```を使用して、読み取りするこのファイルはjsonファイルですよ～みたいなファイルの種類を指定してあげてください。※ヘッダーなしだとエラーが出ました。
ここでは、```mb_convert_encoding()```で文字化けを避けるために```ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN```を```UTF-8```に変換する処理をしています。

```
function print_json($json_file) {
    header("Content-Type: application/json; charset=utf-8");
    $json_file = mb_convert_encoding($json_file, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
  }
```
最後に```json_decode()```でphpの型に直して```var_dump()```で連想配列を出力をしています。

```
var_dump(json_decode($json_file,true));
```
<br>
##テキストファイルへの書き込み、読み込み
  
テキストファイルにはJSON形式で保存しています。
  
```php:PHP
<?php
  $txt_filename = "./test.txt";
  file_put_contents($txt_filename,json_encode($fruits));

  $txt_file = file_get_contents($txt_filename);
  var_dump(json_decode($txt_file,true));
?>
```
**解説**
一行目はjsonの書き込みと同じくファイルのパスを指定してるだけ。

```
  $txt_filename = "./test.txt";
```

二行目では、```file_put_contents()```と```json_encode()```を使用してjson形式に変更した連想配列を先ほど指定したパスに書き込んでいきます。書き込みは一行でできます。
```file_put_cintents( パス , json_encode( 変数 ), フラグ );```
フラグの部分の説明はjsonに書き込んだ時の説明と変わらないので詳しくは上を見に行ってください。

```
  file_put_contents($txt_filename,json_encode($fruits));
```

ここから読み込みです。```file_get_contents()```を使いjsonの中身を取得します。
そこから```var_dump()```で出力をしています。

```
$json_file = file_get_contents($json_filename);
var_dump(json_decode($txt_file,true));
```
<br>
このままだと、書き込んだファイルの中身は日本語の部分がUnicode文字に書き換わっているので、それが嫌な場合は、```json_encode( パス , JSON_UNESCAPED_UNICODE);```と記述すると日本語のまま書き込むことができます。 json , txt 両方とも同じです。
<br>
記事通りやってみたけど、読み・書きができていない場合は読み・書きするファイルのパーミッションを確認してみてください。
<br>
他に良い書き方、間違い等あればアドバイス、ご指摘お願いします。