PHPで配列をそのままテキストにシリアライズとjson_encodeで行う
配列と文字列
PHPでは配列はかなり多用します。そして保存しておきたいデータはデータベースに保存することが多いと思うのですが、ちょっとしたものならデータベースを使う程でもなかったりします。1種類のデータだけ扱うとかだとなおさら。そんな時に便利なのが 配列を文字列化してテキストファイルに保存する方法。
こうすることで、テキストファイルに保存された文字列から配列を復元することができる。データベースを使う場合は配列をデータベースのテーブルに合わせて保存したり、取り出したデータをいちいち配列に戻す処理があるのですが、これが結構面倒なので。テキストファイルに保存してしまうのが楽です。コードも短くなります。
セキュリティ面の問題も多少あります、テキストファイルのままだとWEBからアクセスされることがある、これはWEB非公開エリアに保存するとう方法もしくは、テキストファイルだけど独自の拡張子にしてその拡張子には外部からのアクセスを許可しないようにすれば良い
逆にDBが使えない環境でも、簡易的なデータベースとして利用することが出来る。
シリアライズで文字列を保存する
配列をシリアライズで文字列化して、保存と読込する方法
//配列をarray.dbに文字列で保存する file_put_contents("./array.db", serialize($array)); //array.dbにある文字列を配列に復元する $array = unserialize(file_get_contents("./array.db"));
serialize() で配列が入った変数を文字列に変換しています。file_put_contens() でそれを指定したパスに保存します。
unserialize でシリアライズされた文字列を復元します、file_get_contens でarray.db の中身を取り出しています。
ファイルの拡張子は自由です。
json_encodeを使って文字列で保存する
シリアライズの他にjsonを使った方法でも行うことが出来ます。
//配列をarray.dbに文字列で保存する file_put_contents("./array.db", json_encode($array)); //array.dbにある文字列を配列に復元する $array = json_decode(file_get_contents("./array.db"));
シリアライズの箇所がjsonに変わっただけの文です
シリアライズとJSONの違い
2つの方法を紹介したのですが、それぞれどういった違いがあるかというと。シリアライズされたものをデータベースに保存したい場合はテキスト型ではなくBLOB型に入れなくてはいけないこと、またシリアライズされたものは英数字のみの配列ならJSONよりも容量が大きくなる。JSONの場合はデータベースにテキスト型で保存することが出来る、また英数字のみの配列ならシリアライズより容量を抑えれる、ただマルチバイト文字になると容量はシリアライズよりも大きくなり、デコード時間もシリアライズより掛かる。
シリアライズのメリット
- マルチバイト文字では、JSONよりコンパクト
- エンコード・デコードが早い
- 環境によってはデコードうまくいかないケースがある
JSONのメリット
- 英数字のみならシリアライズよりコンパクト
- データベースにテキスト型で保存出来る
日本語環境ではシリアライズが速度的にも、容量的にも強い。ただ、環境によってはアンシリアライズがうまくいかないことがありみたいです。逆にJSONは速度面、容量面でシリアライズに引けをとるがマルチバイト文字に強く、シリアライズよりも信頼性があると言える。
サンプルコード
シリアライズとJSONを使った配列の文字列変換のサンプルです。ブラウザで開くか実行すると、自動的に配列を文字列にしたファイルが出来ます。ブラウザで表示すれば、配列の中身を復元したものも見れます
<meta charset="UTF-8"> <?php $array = array( "123456789", "123456789", "123456789", "123456789", "123456789", "123456789", "123456789", "123456789", "123456789", "123456789", "123456789", "あいうえお", "あいうえお", "あいうえお", "あいうえお", "あいうえお", "あいうえお", "あいうえお", "あいうえお", "あいうえお", "あいうえお", "あいうえお", "あいうえお", ); //配列をarray.dbに文字列で保存する file_put_contents("./array.db", serialize($array)); //array.dbにある文字列を配列に復元する $serialize = unserialize(file_get_contents("./array.db")); //配列をarray.dbに文字列で保存する file_put_contents("./array2.db", json_encode($array)); //array.dbにある文字列を配列に復元する $json = json_decode(file_get_contents("./array2.db")); echo "シリアライズ<pre>"; var_dump($serialize); echo "</pre><hr>"; echo "JSON<pre>"; var_dump($json); echo "</pre><hr>";
COMMENT