PHP 動態生成 HTML 表格通用函數:字段映射、條件格式化、鏈接生成
本文提供一個靈活的 showTable() 函數,根據字段映射數組動態生成 HTML 表格,支持字段選擇、重命名、條件格式化(如郵箱自動加鏈接)、斑馬紋行色,解決 odbc_result_all() 只能全量輸出、無法定制的痛點。
核心函數集
<?php
/** 顯示表頭 */
function showHeader(array $headerMap) {
echo "<tr>";
foreach ($headerMap as $field => $label) {
echo "<th>$label</th>";
}
echo "</tr>";
}
/** 顯示數據行 */
function showList(array $headerMap, array $dataRows) {
$fields = array_keys($headerMap);
foreach ($dataRows as $i => $row) {
$trClass = ($i % 2 === 0) ? 'even' : 'odd';
echo "<tr class='$trClass'>";
foreach ($fields as $field) {
$value = $row->$field ?? '';
$cell = $value !== '' ? htmlspecialchars($value) : ' ';
// 示例:Email 字段自動加 mailto: 鏈接
if ($field === 'EmailAdd' && $value) {
$cell = "<a href='mailto:$value'>$value</a>";
}
echo "<td>$cell</td>";
}
echo "</tr>";
}
}
/** 主入口:生成完整表格 */
function showTable(array $headerMap, array $dataRows, string $tableAttrs = 'border="1"') {
echo "<table $tableAttrs>";
showHeader($headerMap);
showList($headerMap, $dataRows);
echo "</table>";
}
?>
使用示例
<?php
// 假設從 SQL Server 獲取對象數組
$arr_list = mssql_fetch_object($result); // 返回 stdClass 對象數組
// 定義顯示字段映射:字段名 => 表頭標籤
$arr_header = [
"UserName" => "用戶名",
"EmailAdd" => "電子郵件",
"Homepage" => "個人主頁"
// 故意省略 Password 字段
];
// 調用生成表格
showTable($arr_header, $arr_list, 'border="2" class="user-table"');
?>
輸出效果
進階擴展建議
- 回調格式化:允許傳入
$formatters = ['EmailAdd' => fn($v) => "<a href='mailto:$v'>$v</a>"] 實現通用字段轉換。
- 排序/分頁:結合 JS (DataTables) 或服務端 LIMIT 實現交互式表格。
- 導出功能:復用字段映射生成 CSV/Excel 下載。
- 安全性:所有輸出經
htmlspecialchars() 防 XSS,URL 經 urlencode()。
- 模板引擎整合:現代項目建議改用 Twig/Blade 模板引擎分離邏輯與視圖。
適用場景對比
| 方案 | 優點 | 缺點 | 適用場景 |
| odbc_result_all() | 零代碼、快速原型 | 無法定制字段、樣式、格式化 | 內部調試、臨時導出 |
| 本文 showTable() | 字段可控、支持格式化、可擴展 | 需維護映射配置、純 PHP 渲染 | 中小型後台列表、報表導出 |
| 模板引擎 | 關注點分離、前端友好、緩存優化 | 學習成本、引入依賴 | 中大型項目、團隊協作 |