矩陣轉置(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 )
)
*/
?>
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, ...) | 小型陣列、快速原型、程式碼簡潔優先 | 中 | 中等 |
| 健壯版本 | 不規則陣列、資料清洗階段 | 中 | 中等 |
<?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, ...);不規則資料用健壯版。理解底層邏輯有助於在資料處理任務中靈活應用。