首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 陣列鍵名重構實戰:從資料庫欄位名到數值索引的優雅轉換

     編輯:PHP 相關知識

在 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);

效能優化提示

  • 大數據量時使用 Generator 分批處理,避免記憶體溢出;
  • 搭配 PHPExcel / PhpSpreadsheet 直接寫入流,省去中間陣列;
  • 若僅需 CSV,用 fputcsv 逐行輸出更高效。

這套「標題提取 + 值重組」模式,不僅解決 Excel 匯出,也適用於 CSV、JSON API 等多種序列化場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved