使用PHP创建转置矩阵

7
例如,如果一个矩阵为:
1 2
3 4
5 6

然后上述矩阵的转置将是:

1 3 5
2 4 6

这是我的当前代码:
<?php

    // transpose matrix
    $trans = array(
        array(1, 2),
        array(3, 4),
        array(5, 6)
    );

    foreach ($trans as $key => $val){
        foreach ($trans[$key] as $k => $v){
            echo $v;
        }
    }

?>
2个回答

17

有一种古怪的 PHP 方法可以转置二维数组:

$trans = array(
    array(1, 2),
    array(3, 4),
    array(5, 6)
);

array_unshift($trans, null);
$trans = call_user_func_array('array_map', $trans);
var_dump($trans);

演示

编辑 使用 PHP 5.6 数组展开更简单的方法

随着在 PHP 5.6 中引入数组参数展开功能,我们可以进一步简化这个过程:

$trans = array(
    array(1, 2),
    array(3, 4),
    array(5, 6)
);

$trans = array_map(null, ...$trans);
var_dump($trans);

编辑 说明

引用来自PHP array_map() 函数的文档

这个函数的有趣用法是构建一个数组的数组,可以通过使用 NULL 作为回调函数的名称轻松完成

(查看该文档页面的示例 #4,了解此操作的示例)

我们首先执行的 array_unshift($trans, null) 提供了那个 NULL 回调,我们使用 call_user_func_array(),因为我们不一定知道 $trans 数组中有多少个值。我们使用 call_user_func_array() 所做的相当于:

$trans = array_map(NULL, $trans[0], $trans[1], $trans[2]);

对于您的示例数组,因为您的二维数组顶层有三个元素(键0、1和2)。

实际上,这个NULL回调将并行遍历所有数组,依次从它们中取出每个值以构建一个新数组:

$maxArraySize = max(count($array[0], $array[1], $array[2]);
// $maxArraySize will have a value of 2 in your case,
//     because your sub-arrays are all equal size
$newArray = [];
for($i = 0; $i < $maxArraySize; ++$i) {
    $tmpArray = [];
    $tmpArray[] = $array[0][$i];
    $tmpArray[] = $array[1][$i];
    $tmpArray[] = $array[2][$i];
    $newArray[] = $tmpArray[];
}

这里有一些额外的检查

  • 它不在乎你的数组是关联数组还是枚举数组,因为它访问的是第$i个元素,而不是索引
  • 如果子数组的长度不相等,则会用null值填充较短的子数组,使其与最长子数组的长度相同
  • 无论传入多少个数组,它都会并行处理它们

0

我认为这也适用于矩形数组。 技巧是:return array_map(null, ...$squareArray);对于单列数组似乎以意外的方式工作。

function RotateSquare2DArray($squareArray) 
{

    if ($squareArray == null) { return null; }
    $rotatedArray = array();
    $r = 0;

    foreach($squareArray as $row) {
        $c = 0;
        if (is_array($row)) {
            foreach($row as $cell) {
                $rotatedArray[$c][$r] = $cell;
                ++$c;
            }
        }
        else $rotatedArray[$c][$r] = $row;
        ++$r;
    }
    return $rotatedArray;
}

如果数组是关联数组,我会使用这个。
function RotateSquareAssociativeArray($squareArray)
{
    if ($squareArray == null) { return null; }
    $rotatedArray = array();
    $r = 0;

    foreach($squareArray as $c=>$row) {
        if (is_array($row)) {
            foreach($row as $key=>$cell) {
                $rotatedArray[$key][$c] = $cell;
            }
        }
        else {
            $rotatedArray[$c][$r] = $row;
        }
        ++$r;
    }
    return $rotatedArray;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接