PHPでCSVファイルの書き込みを行う方法

PHPでデータを保存する際にテキストファイルで保存するのであればCSVファイル(Comma-Separated Values)が選択されることがあります。

CSVファイルはデータをカンマで項目毎に区切ったファイルです。

単純なため、データのやりとりによく利用されています。ExcelやAccessでも読み込むことができるため、非常に重宝するファイル形式です。

ここではPHPでCSVファイルの書き込みを行う方法を見ていきます。

データの用意

まず、サンプルデータとしてCSVファイルに書き込むデータを用意しました。これは配列の配列となっています。

$datas = array( 
   array(1,'りんご',100),
   array(2,'みかん',150),
   array(3,'いちご',300)
);

最初の配列には、1、りんご、100というデータが入っています。これが商品番号、商品名、単価を表しています。

次の配列が2件目のデータ(みかん)、3番目の配列が3件目のデータ(いちご)となっています。

このデータをCSV形式でファイル data.csvに保存します。

ファイルのオープン

これらデータを一つのデータにして一度で書き込んでも良いのですが、もしデータ件数が非常に多い場合、長大な文字列をメモリ上に作成してファイルに書き込むことになるので効率がよくありません。

そこで、一行ずつ書き込んでいくことにします。

ファイルを一行ずつ書き込んでいくためには、まずはファイルを開く(オープン)ことから始めなくてはなりません。ファイルのオープンは fopen()関数で行います。

$fp = fopen('data.csv', 'w');

fopen()関数の最初の引数はファイルのパスです。

ここでは同じディレクトリに書き込むという前提でファイル名のみですが、例えば配下のdataディレクトリに書き込むのであれば data/data.csv となります。

二番目の引数はファイルを開くモードを表します。

w は書き込みを表しています。読み込みの場合には r を指定します。

fopen()関数の戻り値 $fp はファイル書き込み時に利用します。

一行ずつ書き込み

次に一件ずつデータを書き込んでいきますので、配列をforeach()で一つずつ取得していきます。

foreach($datas as $data){
  // $dataに配列一つが入る
}

$data は、1、りんご、100といったデータが入った配列です。

これをカンマで連結していきます。

その作業もforeach()で行うことができますが、配列を連結する関数 implode() があるのでそちらを使った方が早いでしょう。

$line = implode(',' , $data);

implode()は最初の引数(カンマ)で二番目の引数の配列を文字列として連結し、その結果を返します。

$lineは "1,りんご,100" といった文字列になるわけです。

これをファイルに書き込みますが、ファイルへの書き込みは fwrite()関数を使います。

fwrite($fp, $line . "\n");

fwrite()の最初の引数はfopen()で得た値です。2番目の引数は書き込むデータです。

ここでは $line に改行(\n)を連結して指定しています。なぜならCSVファイルは1行が1データだからです。

そして、foreach()終了後にファイルを閉じます。

fopen()で開いたファイルは最後にfclose()で必ず閉じます。

fclose($fp);

まとめ

ここまでのコードをまとめると以下のようになります。

なお、ファイルを書き込む場合、書き込むディレクトリに書き込み権限が無くてはなりません。

パーミッションを書き込み可能なように設定しておきましょう。

$datas = array(	array(1,'りんご',100),
		array(2,'みかん',150),
		array(3,'いちご',300));

$fp = fopen('data.csv', 'w');

foreach($datas as $data){

	$line = implode(',' , $data);
	fwrite($fp, $line . "\n");
}
fclose($fp);

イベント