配列を取得してCSVに変換し、ユーザーがCSVをサーバーに保存せずにCSVをダウンロードできるようにする簡単な方法を探しています。
2 に答える
$array = [
['name', 'email'],
['Doe, John', 'johndoe@foo'],
['Jane Doe', 'janedoe@foo'],
['Ron "SuperFly" O\'Neal', 'supafly@foo'],
];
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=test.csv");
$fp = fopen('php://output', 'w'); // or use php://stdout
foreach ($array as $row) {
fputcsv($fp, $row);
}
fputcsv ()を参照してください。
を使用する利点はfputcsv
、フィールドのエスケープと囲みを処理し、列の値にカンマ、引用符、改行文字などの csv 制御文字が含まれていても壊れない有効で頑丈な出力を保証することです...制御文字を確実に処理するように注意しないでください。代わりに、implode(',', $row)
(低品質の) コードを使用すると壊れた csv 出力が生成されるなどの一般的なショートカットを使用してください。
残念ながら、fputcsv は文字列に出力できず、ストリームにしか出力できないため、php の出力ストリームに書き込みphp://output
ますecho
。エコー経由の出力と同様に、php の出力バッファ メカニズムを通過することに注意してください。これにはob_gzhandler
、出力を変更する可能性のある出力バッファ コールバック関数などの可能な出力ハンドラが含まれます。出力バッファをバイパスしたい場合は、代わりに に直接書き込むことができますphp://stdout
。
出力する前に csv ファイルの内容に文字列としてアクセスする必要がある場合は、、、、またはファイルにphp://memory
書き込むこともできます。php://temp
$fp = fopen('php://memory', 'w+'); // or php://temp
foreach ($array as $row) {
fputcsv($fp, $row);
}
// Read it back into a string, if desired.
// Rewind the stream to start.
fseek($fp, 0);
// Read the entire stream back to string.
$csvContents = stream_get_contents($fp);
ストリーム ラッパーに関する情報http://www.php.net/manual/en/wrappers.php.php
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=test.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo "name,city,street\n";
使ったほうがいい場合もある
header("Content-Type: application/octet-stream");
IEの場合...