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

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

[markdown]

> * [Zend_Controller – ContextSwitch アクションヘルパーを利用して、ひとつのコントローラー/アクションでhtml, xml, json, csv出力に対応する | deadwood](https://www.d-wood.com/blog/2013/05/29_3745.html)

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

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

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

“`php
$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

> * [php – export csv in zend framework – Stack Overflow](http://stackoverflow.com/questions/1136264/export-csv-in-zend-framework)
> * [zend framework – File download issue in PHP with Content-Disposition: attachment – Stack Overflow](http://stackoverflow.com/questions/10946077/file-download-issue-in-php-with-content-disposition-attachment)

### fputcsv

> * [PHP – 配列をたった一行で CSV に変換 – Qiita [キータ]](http://qiita.com/caesar_cat/items/e204896223e966bb555f)
> * [PHP How to convert array into csv using fputcsv function – Stack Overflow](http://stackoverflow.com/questions/14809133/php-how-to-convert-array-into-csv-using-fputcsv-function)

### TSV

> * [CSV出力とダウンロード選択ダイアログ。 – Chocotte de Choo](http://d.hatena.ne.jp/Choo/20090410/1239621258)
>
> TSVで出力したい場合、「fputtsv」という関数は無いので、fputcsvの引数に「」を渡して処理します。
> 上の例のfputcsvに修正を加えると… fputcsv($fp,$line, "¥t"); これでタブ区切りで出力されるようになります。
> そして、ダウンロードさせる時のContent-Typeは、 「text/tab-separated-values」 です。

[/markdown]