Created
October 10, 2018 14:08
-
-
Save nczz/cb30851c77035ee5678ada1a2e13ae3e to your computer and use it in GitHub Desktop.
[PHP] 寫出一個匯出 CSV 檔案的起手式
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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