第13章 · 初心者向け
CSV出力
表データをファイルにして渡す、業務で頻出の機能です。
1. CSVとは
カンマで区切ったテキスト。Excelや他システム連携でよく使う
ID,タイトル,完了
1,書類提出,0
2,買い物,1
2. DBから対象データ取得
$todos = $this->Todos->find()
->where(['user_id' => $userId])
->all();
3. CSV用にデータを加工
1行目は見出し、2行目からデータ、が分かりやすいです。
$rows = [];
$rows[] = ['ID', 'タイトル', '完了'];
foreach ($todos as $todo) {
$rows[] = [$todo->id, $todo->title, $todo->done ? '1' : '0'];
}
4. CSVレスポンス
ブラウザに「これはダウンロード用」と伝えます。
$this->response = $this->response->withType('csv');
$this->response = $this->response->withDownload('todos.csv');
5. ファイルとして出力
public function export()
{
$todos = $this->Todos->find()->all();
$fh = fopen('php://temp', 'r+');
fputcsv($fh, ['ID', 'Title', 'Done']);
foreach ($todos as $todo) {
fputcsv($fh, [$todo->id, $todo->title, (int)$todo->done]);
}
rewind($fh);
$csv = stream_get_contents($fh);
fclose($fh);
return $this->response
->withType('csv')
->withDownload('todos.csv')
->withStringBody($csv);
}
6. 日本語・文字コードについて
Excelで文字化けしたら
UTF-8の先頭に BOM を付ける、または SJIS に変換する、のどれかが必要なことがあります。
$csv = "\xEF\xBB\xBF" . $csv; // UTF-8 BOM の例
第13章 やってみよう
EXERCISE
- 見出し+データ行の配列を作る
- ダウンロード用レスポンスの骨格を写経する
- 日本語タイトルで文字化けしないか確認する