【PHP】JSONの読み込み⇒編集⇒保存

今回はphpでJSONデータを読み込み、編集をし、保存を行いたいと思います。
このサイトのデモサイトをまとめているページを少し便利に使用と思ったのがきっかけです。
変更前の状態
変更前は手書きで編集をしていました。
JSONファイルはこのような形です。
{"blogtitle" : "【PHP】JSONの読み込み⇒編集⇒保存" ,"blogurl" : "https://kumatech-lab.com/edit-php-json/" ,"date" :{"year" : "2020" ,"month" : "5" ,"day" : "30"},"demourl" : "デモサイトURL"}
ブログタイトル、ブログURL、日付、デモサイトURLの4つの情報を持っています。
これをphpで読み込み、表のような形で表示していました。

わざわざJSONファイルを開いて変更するのは面倒に感じていたため今回自動で作成しよういう次第です。
イメージ的にはフォームのような形です。
PHPで上のJSONファイルを開いてフォームの情報をJSONファイルに追加するといった感じです。
それでは見ていきましょう。
JSONファイル読み込み⇒編集⇒保存
JSONファイルの読み込み
まずはJSONファイルの読み込みです。
$json = file_get_contents($url);$json = mb_convert_encoding($json, "UTF8" , 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');$arrJson = json_decode($json,true);
「file_get_contents」で引数のURLからJSONファイルのデータを取得します。
JSONファイルの形にもよりますが、文字化けしないようにエンコードを行います。
文字化けをするとこのような形です。
{"blogtitle":"\u3010JavaScript\u3011JSON\u30c7\u30fc\u30bf\u306e\u53d6\u308a\u6271\u3044"
文字コードになっているのがわかるとがわかると思います。
それを「mb_convert_encording」で変更します。今回はUTF-8にに変えています。
この段階ではまだ、UTF-8形式の文字列ですので、それをPHPの型にして連想配列として扱えるようにしていきます。
それが「json_decode」の記述です。
UTF-8形式のJSON文字列をPHPで扱えるようにするものです。
これで読み込みは完了です。
JSONファイルの編集
JSONファイルの編集を行うにあたり、登録するための情報は以下のようなフォームからPOSTで送ります。

まずは、上のJSONファイルと同様な配列を用意します。
$addArr = array("blogtitle" => $_POST["blogtitle"] ,"blogurl" => $_POST["blogurl"] ,"date" => array("year" => $_POST["year"] ,"month" => $_POST["month"],"day" => $_POST["day"]),"demourl" => $_POST["demourl"]);
自分しか使わないため、データチェック等入れていませんが、必要な場合はデータチェックをかませましょう。
作った配列をもともとある配列に追加します。
$arrJson[] = $addArr ;
これで、配列上は追加が完了しました。
次にこの配列を使用し、再びJSON形式にします。
JSONファイルの保存
ここでは先ほど完成したJSONにするための配列をJSON形式にし、保存をします。
ではまずは配列をJSON形式にする過程です。
JSON形式を配列にしたのと逆の手順です。
$arrJson = json_encode($arrJson);
指定した引数の値をJSON形式に変更します。
変更できたのでファイルを保存します。保存するのは以下のようです。
file_put_contents($url, $arrJson);
一つ目の引数にファイルパスを指定します。二つ目に書き込むデータを用意します。
ファイルパス先のファイルにデータを書き込みます。
ファイルパス先にすでにファイルが存在する場合には上書き、存在しない場合には新規作成されます。
この辺りは、引数のオプションで細かく制御できるようです。必要な場合は確認してみてください。
以上で一連流れが完了です。
まとめ
これでフォームにピッとコピペするだけでJSONファイルに新規追加できるようになりました。
結局のところコピペの作業は必要になってしまいますが、形式のエラーなどは回避できます。
簡単にできると思っていたのですが、配列の追加するところで少々手間取りました。
上の例では簡単に記述したのですが、実際は配列内の配列に追加しているため、追加した際におなじ形式で追加されなかったのです。
良い勉強になりました。