メモ
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' );