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

PHP 二維陣列矩陣轉置實作:行列互換的多種方法與效能比較

     編輯:PHP 相關知識

PHP 二維陣列矩陣轉置實作指南

矩陣轉置(Transpose)是將二維陣列的行與列互換,即 $result[$j][$i] = $source[$i][$j]。這在資料處理、科學計算、表格輸出等場景常見。本文介紹三種實作方式,並分析其適用場景與效能差異。

方法一:雙重迴圈(基礎版)

<?php

function transposeBasic(array $matrix): array
{
    if (empty($matrix)) {
        return [];
    }

    $rows = count($matrix);
    $cols = count($matrix[0]);

    // 驗證矩形陣列
    foreach ($matrix as $row) {
        if (count($row) !== $cols) {
            throw new \InvalidArgumentException('輸入必須為矩形陣列(每行長度一致)');
        }
    }

    $result = [];
    for ($j = 0; $j < $cols; $j++) {
        $result[$j] = [];
        for ($i = 0; $i < $rows; $i++) {
            $result[$j][$i] = $matrix[$i][$j];
        }
    }
    return $result;
}

// 測試
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
];
print_r(transposeBasic($matrix));
/*
Array
(
    [0] => Array ( [0] => 1, [1] => 4 )
    [1] => Array ( [0] => 2, [1] => 5 )
    [2] => Array ( [0] => 3, [1] => 6 )
)
*/
?>

方法二:利用 array_map 與 null 回呼(函數式風格)

PHP 的 array_map(null, ...$matrix) 可直接實現轉置,利用「多陣列模式下 null 回呼會返回參數陣列」的特性。

<?php

function transposeFunctional(array $matrix): array
{
    if (empty($matrix)) {
        return [];
    }
    // 解包陣列傳給 array_map
    return array_map(null, ...$matrix);
}

// 測試
$matrix = [[1,2,3], [4,5,6]];
print_r(transposeFunctional($matrix));
?>

優點:程式碼極簡潔。
缺點:若子陣列長度不一,會以最長者為準,缺位補 null,行為與數學定義不符;大型陣列記憶體效率較低。

方法三:支援非矩形陣列的健壯版本

<?php

function transposeRobust(array $matrix, bool $strict = true): array
{
    if (empty($matrix)) {
        return [];
    }

    $rows = count($matrix);
    $cols = 0;
    foreach ($matrix as $row) {
        $cols = max($cols, count($row));
    }

    $result = [];
    for ($j = 0; $j < $cols; $j++) {
        $result[$j] = [];
        for ($i = 0; $i < $rows; $i++) {
            $result[$j][$i] = $matrix[$i][$j] ?? ($strict ? null : '');
        }
    }
    return $result;
}
?>

效能比較與建議

方法適用場景記憶體效率速度
雙重迴圈大型矩陣、需嚴格驗證、高效能需求高最快
array_map(null, ...)小型陣列、快速原型、程式碼簡潔優先中中等
健壯版本不規則陣列、資料清洗階段中中等

實際應用範例:CSV 資料行列轉換

<?php

function csvTranspose(string $inputFile, string $outputFile): void
{
    $rows = [];
    if (($handle = fopen($inputFile, 'r')) !== false) {
        while (($row = fgetcsv($handle)) !== false) {
            $rows[] = $row;
        }
        fclose($handle);
    }

    $transposed = transposeBasic($rows);

    if (($handle = fopen($outputFile, 'w')) !== false) {
        foreach ($transposed as $row) {
            fputcsv($handle, $row);
        }
        fclose($handle);
    }
}
?>

結語

PHP 陣列轉置雖無內建函數,但透過雙重迴圈即可高效實現。建議根據資料特性選擇:規則矩陣用基礎版追求效能;快速開發用 array_map(null, ...);不規則資料用健壯版。理解底層邏輯有助於在資料處理任務中靈活應用。

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