[Zend Framework] Zend_Layout: fputcsv を利用して、配列をCSVに変換/ダウンロード

以前に ContextSwitch を利用して CSV ファイルを作成したのですが、fputcsv という PHP 関数を利用した方法を試してみました。

Zend Framework 内で使う場合の手順は、こんな感じのようです。

  1. ビューレイアウトを無効にする
  2. fputcsv を使ってファイルを生成
  3. ダウンロード (headerを作成)

Action 内で下記のような形で使えました。

$csv = array(
   array('1111', '1111', '1111', '1111'),
   array('2222', '2222', '2222', '22,22'), // カンマ混在
   array('3333', '3333', '3333', "33\n33"),// 改行混在
   array('title' => 'タイトル', // 連想配列
          'name'  => '名",前',// ダブルクォート,カンマ混在
          'hoge'  => 'ほげ',
          'fuga'  => 'ふが'),
);
$filename = 'sample.csv';
// Zend_View, Layout の無効化
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
//open/save dialog box
header("Content-Disposition: attachment; filename=\"$filename\"");
//content type
header("Content-type: application/octet-stream");
header("Pragma: no-cache");
header("Expires: 0");
//read from array and STDOUT
$fp= fopen('php://output', 'w');
foreach ($csv as $fields) fputcsv($fp, $fields);
fclose($fp);

disableLayout, setNoRender

fputcsv

TSV

TSVで出力したい場合、「fputtsv」という関数は無いので、fputcsvの引数に「」を渡して処理します。
上の例のfputcsvに修正を加えると… fputcsv($fp,$line, "¥t"); これでタブ区切りで出力されるようになります。
そして、ダウンロードさせる時のContent-Typeは、 「text/tab-separated-values」 です。