2015-05-06 34 views
6

我想顺时针旋转矩阵90度。这相当于使输入中的第一列成为输出的第一行,输入的第二列成为输出的第二列,输入的第三列成为输出的第三列。请注意,由于90度的旋转,列的底部=行的起始位置。我如何在php中将二维数组旋转90度

例如:

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

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

我所知道的是我第一次转置矩阵,然后交换列90度旋转矩阵。这如何应用于PHP?

+0

什么是您的数据结构?你只想打印你的新矩阵? – Niols

+0

数字,我只是wana旋转矩阵,因为你可以看到后 –

回答

2

php没有添加某种线性代数库的概念,如矩阵的“转置”。 您可以本地通过矩阵eaching和交换一些指标

<?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 
+0

如果你想旋转矩阵不止一次,你需要修复外部阵列的键。添加'$ mat90 = array_values($ mat90);''返回$ mat90之前'' – daggerhart

6

我展示了如何转在回答一个数组到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

这真是太棒了,谢谢!仍试图了解它如何实际工作... – Gannet

+0

@Gannet - [我提供了一个类似的问题在这里提供了一个解释提供了解释](http://stackoverflow.com/questions/30082814/create-transpose-matrix-using -php/30082922#30082922) –

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的那么聪明。也许更清楚。