配列をCSVファイルとしてエクスポートする

CSVファイルとは

CSVファイルとはComma Separated Valueの略で文字通り、値を,(カンマ)で区切ったものが入っているファイルで拡張子は.csvです。

配列からCSVファイルを生成する

今回は用意された配列をCSVファイルに変換してブラウザ上でダウンロードする機能をcakePHPを使って実装します。最後の部分以外は素のphpで問題ありません。 まずはじめにCSV形式にしたい元の配列を定義します。

 $header = array("出席番号", "名前", "身長");
 $datas = array(
        array(1, "山田太郎", 167)
        , array(2, "鈴木花子", 158)
        , array(3, "高橋健太", 174)
    );

次にファイルの出力先を指定します phpの関数sys_get_temp_dirを使ってPHPが一時ファイルを保存するデフォルトのディレクトリのパスを取得します.

そしてtempnamを使って一意なテンポラリファイル名を指定したディレクトリに作成します。戻り値は作成したファイルへのフルパスになります。

 $temp_dir = sys_get_temp_dir();
 $temp_csv_file_path = tempnam($temp_dir, 'temp_csv');

作成したファイルにCSV形式で書き込んでいきます。fopenでファイルを開いた時、最後にfcloseでファイルを閉じることを忘れないでください。fputcsv関数で行(一次元配列)をCSV形式に直して出力することができます。今回は書き込みだけ行うのでfopenの第2引数にはw(writeの意)を指定しています。

 $fp = fopen($temp_csv_file_path, 'w');
 fputcsv($fp, $header);

 foreach($datas as $data){
//一次元配列にする
  $row = array(
   $data[0]
   ,$data[1]
   ,$data[2]
   ,$data[3]
   ,$data[4]
  );
  fputcsv($fp, $data);
  }
  fclose($fp);

最後に次のようにファイルのフルパスをHTTPで送ってあげればブラウザ上ででダウンロードすることができます。この処理のみcakePHPで定義されたものを使っているので注意してください Cake\Http\Response::withFile関数を使ってファイルを送信します。withFileを呼ぶ前にCake\Http\Response::withType関数を使って新しいタイプを追加できます

$this->response = $this->response->withType('csv');
        return $this->response->withFile(
            $temp_csv_file_path,
            [
                'download' => true,
                'name' => 'hoge.csv'
            ]
        );