- ベストアンサー
多次元配列のオーソドックスなファイル書き込みについて教えてください
PHP勉強中のAJAMAです。 下記にありますようなプログラムによって配列構造を持った変数をCSVファイルに書き込み、一行を1レコードとして管理をしたいと考えています。書き込み処理は、一意である変数の場合は、きっちりと書き込まれるのですが、配列変数の部分はarrayと書き込まれてしまいます。配列変数の中身を書き込むには、join(",",$xxxx)とすることで、すべてを同じ一行に書き込むことができました。しかしこれですと、すべてが、,区切りの二次元構造になってしまうので、これらのデータを読み込んで活用したい場合に、多次元構造を把握する処理をしなくてはいけないように見えるのですが、どうにもその仕組みを思考することができないので、模範的な手法を教えていただけないでしょうか。 serialize()も試してみましたが、知識がオブジェクト指向にまでいたっていないこともあり、うまくいきませんでした。(実行環境がPHP4だからかもしれません) 以 下、作成中のソースコードです。 ※$numから右が配列変数部 $lines=array("$recordID",$nickname,$date,$area,$num,$item,$size); $lines=implode(",",$lines); $lines=$lines."\n"; serialize($lines); ←試行して不成功だった加筆部分。 //CSVファイルに書き込み $fp=fopen("report.csv","a"); flock($fp, LOCK_EX); fputs($fp,$lines); fclose($fp); 宜しくお願いいたします。
- みんなの回答 (9)
- 専門家の回答
補足
まず、質問の中に『二次元』と書いてますが1レコードの範囲においては『一次元』かとおもいますので、訂正させていただきます。すみません。 言葉足らずになっているかと思いましたので、シリアライズを試した経緯も説明させていただきます。 serialize()の振る舞いを調べましたところ、『バイト文字列に変換する』『メソッド以外のオブジェクト、変数、配列が対象』とのことですので、理屈的に多次元の文字列を直列変換する(バイト文字列にする)ことで一行一レコードとして、変換できると考えたからです。 ご指導いただいたコードと私のコードの違いは、以下のとおりです。 serialize($lines); 書き込みの前にシリアル化した。 ↓ fputs($fp, serialize($lines)); 書き込む寸前にシリアル化 現在、実行環境がないので、試していませんが、シリアル化するタイミングが悪いと理解してます。後ほどこれを試してみます。 unserialize(fgets($fp));については、どのような形態で展開されることになるのか分かりませんが、こちらも試してみます。 後、CSVをにこだわる理由ですが、サーバにDBがないのと、管理が用意というイメージを持っているからです。テキストファイルに格納する場合の理想的な方法は、これから勉強していきたいと考えてます。