如何在PHP中旋转二维数组90度

时间:2015-05-06 20:43:11

标签: php arrays matrix

我想将矩阵顺时针旋转90度。这相当于使输入中的第一列成为输出的第一行,输入的第二列成为输出的第二行,输入的第三列成为输出的第3行。请注意,列的底部=行的开头,因为旋转90度。

例如:

$matrix=    [[1, 2, 3]
             [4, 5, 6], 
             [7, 8, 9]];

rotate90degrees($matrix)=      [[7, 4, 1],
                                [8, 5, 2],
                                [9, 6, 3]]

我所知道的是我首先转置矩阵,然后交换列以将矩阵旋转90度。如何将其应用于php?

6 个答案:

答案 0 :(得分:7)

我向您展示了如何转换数组以回答previous question,旋转90度,使用该转置逻辑,然后依次颠倒每行中值的顺序:

$matrix = [
    [1, 2, 3],
    [4, 5, 6], 
    [7, 8, 9],
];

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

Demo

答案 1 :(得分:2)

php没有像矩阵的“转置”这样的概念而没有添加某种线性代数库。 你可以通过遍历矩阵并交换一些索引来原生地实现它

<?php

function rotate90($mat) {
    $height = count($mat);
    $width = count($mat[0]);
    $mat90 = array();

    for ($i = 0; $i < $width; $i++) {
        for ($j = 0; $j < $height; $j++) {
            $mat90[$height - $i - 1][$j] = $mat[$height - $j - 1][$i];
        }
    }

    return $mat90;
}

$mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
print_r($mat);
//123
//456
//789
print_r(rotate90($mat));
//741
//852
//963


$mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9], ["a", "b", "c"]];
print_r($mat);
//123
//456
//789
//abc
print_r(rotate90($mat));
//a741
//b852
//c963

答案 2 :(得分:2)

另一个可靠的选择:

function rotateMatrix90( $matrix )
{
    $matrix = array_values( $matrix );
    $matrix90 = array();

    // make each new row = reversed old column
    foreach( array_keys( $matrix[0] ) as $column ){
        $matrix90[] = array_reverse( array_column( $matrix, $column ) );
    }

    return $matrix90;
}

远不如@ mark-baker的聪明。也许更清楚。

答案 3 :(得分:1)

您可以一站式,两步过程来简洁地转置矩阵数据。第一个array_map()内部调用将列数据转换为行数据。第二个array_map()调用反转行数据的顺序。 *请注意,幸运的是,对于这种情况,splat运算符(...)仅解包索引元素,因此不需要数据准备。

代码:(Demo

$matrix = [
    [1, 2, 3],
    [4, 5, 6], 
    [7, 8, 9],
];

var_export(array_map('array_reverse', array_map(null, ...$matrix)));

输出:

[[7,4,1],
 [8,5,2],
 [9,6,3]]

答案 4 :(得分:0)

下面的代码正在使用额外的空间。

<?php

function rotate90degrees()
{
    $matrix = [[1,2,3],
               [4,5,6],
               [7,8,9]];
               
    $k = 0;
    $len = count($matrix[0]);
    $tmp = [];
    
    // Create a new matrix with [[0,0,0],[0,0,0],[0,0,0]]
    while($k < $len) {
        $row = [];
        $l = 0;
        while($l < $len) {
            $row[] = 0;
            $l++;
        }
        $tmp[] = $row;
        $k++;
    }
    
    // Rotate through the given matrix and fill out the above created new matrix
    for($i=0; $i<$len; $i++) {
        for($j=$len-1; $j>=0; $j--) {
            $tmp[$i][$j] = $matrix[$j][$i];
        }
        $tmp[$i] = array_reverse($tmp[$i]);
    }
    
    return $matrix;
}

以下功能不占用额外的空间。

<?php

function rotate90degreesWithoutAdditionalSpace()
{
    $matrix = [[1,2,3],
               [4,5,6],
               [7,8,9]];
               
    $len = count($matrix);
    
    // Swap the rows columns.
    for($i=0; $i<$len; $i++) {
        for($j=$i; $j<$len; $j++) {
            $tmp = $matrix[$i][$j];
            $matrix[$i][$j] = $matrix[$j][$i];
            $matrix[$j][$i] = $tmp;
        }
    }
    
    // Swap the elements from both ends of each row until the centered element in the row.
    for($i=0; $i<$len; $i++) {
        for($j=0; $j<floor($len/2); $j++) {
            $tmp = $matrix[$i][$j];
            $matrix[$i][$j] = $matrix[$i][$len-1-$j];
            $matrix[$i][$len-1-$j] = $tmp;
        }
    }
    
    return $matrix;
}
    

答案 5 :(得分:0)

您可以使用以下代码旋转矩阵 cw:

function rotateCW($arr){
    return array_map(function($row, $i) use ($arr){
        return array_reverse(array_column($arr, $i));
    }, $arr[0], array_keys($arr[0]));
}

并使用以下代码逆时针旋转:

function rotateCCW($arr){
    return array_map(function($row, $i) use ($arr){
        return array_column($arr, count($arr[0]) - 1 -$i);
    }, $arr[0], array_keys($arr[0]));
}