在 Yii 等框架中,資料庫查詢結果預設以欄位名作為鍵名的關聯陣列輸出。但匯出 Excel、API 序列化等場景下,往往需要純數值索引的二維陣列。本文介紹一種通用的鍵名重構方法。
資料庫查詢返回格式如下:
[
['id' => 1, 'name' => '張三', 'email' => 'a@b.com'],
['id' => 2, 'name' => '李四', 'email' => 'c@d.com']
]
匯出 Excel 時需轉為:
[
['id', 'name', 'email'], // 標題行
[1, '張三', 'a@b.com'], // 數據行
[2, '李四', 'c@d.com']
]
function restructure_for_export(array $data): array {
if (empty($data)) {
return ['titles' => [], 'rows' => []];
}
// 取首行鍵名作為標題
$titles = array_keys($data[0]);
// 將每行轉為數值索引陣列
$rows = array_map('array_values', $data);
return [
'titles' => $titles,
'rows' => $rows
];
}
實際專案中常需調整欄位順序、重命名標題或過滤敏感欄位。可擴展為:
function restructure_advanced(array $data, array $field_map = []): array {
if (empty($data)) return ['titles' => [], 'rows' => []];
$first = $data[0];
$titles = $field_map ? array_values($field_map) : array_keys($first);
$keys = $field_map ? array_keys($field_map) : array_keys($first);
$rows = [];
foreach ($data as $row) {
$new_row = [];
foreach ($keys as $key) {
$new_row[] = $row[$key] ?? '';
}
$rows[] = $new_row;
}
return compact('titles', 'rows');
}
// 使用範例
$map = [
'name' => '姓名',
'email' => '郵箱',
'id' => 'ID'
];
$result = restructure_advanced($users, $map);
PHPExcel / PhpSpreadsheet 直接寫入流,省去中間陣列;fputcsv 逐行輸出更高效。這套「標題提取 + 值重組」模式,不僅解決 Excel 匯出,也適用於 CSV、JSON API 等多種序列化場景。