Skip to content

Instantly share code, notes, and snippets.

@nczz
Created October 10, 2018 14:08
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nczz/cb30851c77035ee5678ada1a2e13ae3e to your computer and use it in GitHub Desktop.
Save nczz/cb30851c77035ee5678ada1a2e13ae3e to your computer and use it in GitHub Desktop.
[PHP] 寫出一個匯出 CSV 檔案的起手式
<?php
//設定系統環境,確保輸出執行環境無礙
set_time_limit(0);
ini_set('memory_limit', '256M');
//判斷執行權限
//建立資料庫連線,開始取得資料
//撰寫資料庫欄位與可讀性資料的轉換方法
function mapping_submission_category($id="") {
//常見的就是把變數換成換成可閱讀可理解的字串
$arr = array(
'0' => '分類一',
'1' => '分類二',
);
if ($id != ""){
return $arr[$id];
} else {
return $arr;
}
}
function mapping_submission_user_age($id="") {
//或是某些根據專案特殊轉譯過的變數替換
}
//開始準備一組匯出陣列
$csv_arr = array();
//先放置 CSV 檔案的標頭資料
$csv_arr[] = array('得票數', '系統編號', '報名人', '身分證字號', '信箱', '聯絡電話', '聯絡手機', '聯絡地址', '性別', '年齡', '作品名稱', '作品分類', '拍攝日期', '拍攝地點', '拍攝相機', '拍攝鏡頭', '相片原始檔案', '投稿日期', '審查狀態');
//設定檔案輸出名稱
$filename = "contest-data-export-" . date("Y-m-d-H-i-s") . ".csv";
//設定瀏覽器讀取此份資料為不快取,與解讀行為是下載 CSV 檔案
header('Pragma: no-cache');
header('Expires: 0');
header('Content-Disposition: attachment;filename="' . $filename . '";');
header('Content-Type: application/csv; charset=UTF-8');
for ($i = 0; $i < count($photo_data); $i++) {
$p = $photo_data[$i];
$csv_arr[] = array(
//開始根據資料變數組裝後面的陣列資料
);
}
//確保輸出內容符合 CSV 格式,定義下列方法來處理
function csvstr(array $fields): string{
$f = fopen('php://memory', 'r+');
if (fputcsv($f, $fields) === false) {
return false;
}
rewind($f);
$csv_line = stream_get_contents($f);
return rtrim($csv_line);
}
//正式循環輸出陣列內容
for ($j = 0; $j < count($csv_arr); $j++) {
if ($j == 0) {
//檔案標頭如果沒補上 UTF-8 BOM 資訊的話,Excel 會解讀錯誤,偏向輸出給程式觀看的檔案
echo "\xEF\xBB\xBF";
}
//輸出符合規範的 CSV 字串以及斷行
echo csvstr($csv_arr[$j]) . PHP_EOL;
}
//跑完這份檔案就會是下載一份完整的 CSV 檔案囉!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment