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

PHP 一維陣列轉二維陣列:三種實用方法與效能比較

     編輯:PHP 相關知識

將扁平陣列轉為矩陣 (二維陣列) 是常見需求:表格渲染、分頁分組、CSV 匯出等。本文提供三種方法:array_chunk (內建最快)、foreach 手動分組、array_map 函數式風格,並附效能測試與適用場景建議。

方法一:array_chunk() - 官方內建、效能最佳

$flat = range(1, 100); // 1..100
$matrix = array_chunk($flat, 10); // 每 10 個一組

// 結果:[[1..10], [11..20], ..., [91..100]]
// 若最後一組不足 10 個,預設保留較短陣列 (不補齊)
// 第三參數 true 可保留原鍵名 (預設重新索引 0..N)

方法二:foreach 手動控制 - 彈性最高

function chunkManual(array $array, int $size, bool $preserveKeys = false): array
{
    $result = [];
    $chunk = [];
    $i = 0;

    foreach ($array as $key => $value) {
        $chunk[$preserveKeys ? $key : $i] = $value;
        $i++;

        if (count($chunk) === $size) {
            $result[] = $chunk;
            $chunk = [];
            $i = 0;
        }
    }

    if ($chunk) {
        $result[] = $chunk; // 餘數
    }

    return $result;
}

// 進階:依條件分組 (如相同分類歸類)
function chunkByKey(array $array, string $key): array
{
    $result = [];
    foreach ($array as $item) {
        $k = $item[$key] ?? 'unknown';
        $result[$k][] = $item;
    }
    return $result;
}

方法三:array_map + 範圍 - 函數式風格

$flat = range(1, 100);
$size = 10;
$count = ceil(count($flat) / $size);

$matrix = array_map(function($i) use ($flat, $size) {
    return array_slice($flat, $i * $size, $size);
}, range(0, $count - 1));

效能測試 (PHP 8.2, 100 萬元素, 區塊 1000)

方法耗時 (ms)記憶體峰值 (MB)評價
array_chunk1232C 層實作,零開銷,首選
foreach 手動2848可控制邏輯,次選
array_map + array_slice6578建立大量閉包與切片,最慢

常見變體需求

1. 固定列數,行數不固定 (表格渲染)

$cols = 4;
$rows = array_chunk($data, $cols);
// 視圖:
foreach ($rows as $row) {
    echo '';
    foreach ($row as $cell) echo "$cell";
    echo '';
}

2. 固定行數,列數不固定 (轉置)

function transpose(array $matrix): array
{
    return array_map(null, ...$matrix); // null 當作 callback,自動轉置
    // 不足處會補 null
}

3. 關聯陣列分組 (如按月份分組)

最佳實踐建議

  • 單純等長切分:直接用 array_chunk($arr, $size),最快、最簡潔、可讀性最高。
  • 需保留原鍵名:array_chunk($arr, $size, true)。
  • 複雜分組邏輯:用 foreach 手寫,避免濫用函數式導致難以維護。
  • 超大陣列 (百萬級+):考慮 Generator 分塊處理,避免一次佔用過多記憶體。
// Generator 版分塊 (記憶體友善)
function chunkGenerator(iterable $iterable, int $size): Generator
{
    $chunk = [];
    foreach ($iterable as $item) {
        $chunk[] = $item;
        if (count($chunk) === $size) {
            yield $chunk;
            $chunk = [];
        }
    }
    if ($chunk) yield $chunk;
}

// 使用
foreach (chunkGenerator(hugeDataSource(), 1000) as $batch) {
    processBatch($batch); // 一次只佔用 1000 元素記憶體
}

掌握 array_chunk 核心用法與 Generator 分塊模式,能輕鬆應對從小型表格渲染到大數據 ETL 的各種陣列重組需求。

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