メモ
function exportCsv($fileName, $data, $header = null) {
// headerがあれば先頭行に追加
if(!is_null($header)) array_unshift($data, $header);
// tmpファイルストリームをオープン
$fp = tmpfile();
// データの書き込み
foreach($data as $v) fputcsv($fp, $v, ',', '"');
// ファイルポインタを先頭へ移動
rewind($fp);
// ストリームを文字列に読み込む
$csv = stream_get_contents($fp);
// 文字コードをSJISにコンバート(excelで開いた際の文字化け対策)
$csv = mb_convert_encoding($csv, 'SJIS', mb_internal_encoding());
// ファイルポインタを閉じる
fclose($fp);
// 指定したファイル名の拡張子やパスを取り除く
$fileName = basename($fileName);
// ダウンロード用のヘッダーを出力
header('Content-Disposition:attachment; filename="'.$fileName.'.csv"');
header('Content-Type:application/octet-stream');
header('Content-Length:'.strlen($csv));
echo $csv;
die();
}
$fileName:保存したいファイル名を指定
$data:CSVファイルに書き込みたいデータを連想配列で指定
$header:先頭行に配置するデータを配列で指定(1行分)
以下渡すデータの例。
// ヘッダー(先頭行)
$header = array(
'name_1',
'name_2',
'name_3',
'name_4',
'name_5',
);
// データ部分(基本foreachで回す)
$data[] = array(
'col_data_1',
'col_data_2',
'col_data_3',
'col_data_4',
'col_data_5'
);
$data[] = array(
'col_data_1',
'col_data_2',
'col_data_3',
'col_data_4',
'col_data_5'
);