使用PHP创建转置矩阵



例如,如果矩阵是:

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;
        }
    }
?>

有一种古怪的php方法可以传输一个2D数组:

$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 Array解开包装

更轻松的方法

随着php 5.6中的数组参数解开包装功能的引入,我们可以进一步简化这一点:

$trans = array(
    array(1, 2),
    array(3, 4),
    array(5, 6)
);
$trans = array_map(null, ...$trans);
var_dump($trans);

编辑说明

引用array_map()函数的php文档:

此功能的有趣用途是构造一个数组数组,可以通过使用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]);

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

有效地,此无空回调循环通过并行从它们中的每个值中的所有阵列循环构建一个新数组:

$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元素,而不是索引
  • 如果子阵列的长度并非全部相同,则有效地将较短的子阵列填充,以匹配最长的长度
  • 的长度
  • 您传递了多少个数组都没关系,它将与它们合作,并并行

我相信这也可与矩形数组一起使用。技巧: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;
}

最新更新