ファイルの読み書きについて検索してると良く見かけるのが、
ファイルを開いて、行があるだけ読み込んで、閉じてって流れを良く見かけます。
書くときも、ファイルを開いて、ロックして、書き込んで、ファイルを閉じてって流れを見かけます。
今まで僕もそう書いてたんですけど、毎回読み出しがややこしくて調べます。
実は3行で書ける
今日も、あーファイルだーめんどくせーと思って、いつもの流れを調べてたんですけど、
こないだそういや参考書買ったじゃないかと思って、パーフェクトPHPを開いてみると、
えらく簡単にできるじゃないですか。
今までのコード
$fp = fopen(path,"r"); $row = 1; if (($read = $fp) !== FALSE) { while (($data = fgetcsv($read, 1000, ",")) !== FALSE) { $row++; for ($i=0; $i < count($data); $i++) { echo $data[$i]; } } fclose($read); } $fp = fopen(path,"ab"); flock($fp,LOCK_EX); fwrite($fp,"なんか文字"); flock($fp,LOCK_UN); fclose($fp);
この非常に面倒くさいコードが
define(path,"nantyara.csv"); echo file_get_contents(path); file_put_contents(path, "おとくな三行", FILE_APPEND | LOCK_EX);
こんだけで書けます。
ファイル読み込み時に配列で取得する
このまま取ると、そのままファイルの内容が吐き出されるので、
配列にすると便利です。
define(path,"nantyara.csv"); //改行を区切り文字として一行ごとに配列化する $line = explode("n",file_get_contents(path)); //カンマ区切りを配列にする $line = explode(",",file_get_contents(path));
便利だなーって思いました。
でもカンマ区切りの配列だと扱いにくいので1行ごとに連想配列で取得したかったんですけど、
できなかったので、nを区切り文字として、配列に置き換えました。なんか良い方法ないかなー。
$line = explode("n",file_get_contents(path)); foreach($line as $val) { explode(",",$val) }
ってやれば可能だそうですよ!