PHP逆时针旋转矩阵

时间:2013-06-08 08:24:56

标签: php arrays matrix

我正在解决一个更大的问题,我需要逆时针旋转一个二维阵列。

所以,如果我有这个矩阵:

1 2 3 4
1 2 3 4
3 4 5 6
3 4 5 6

轮换后,它将是:

4 4 6 6
3 3 5 5
2 2 4 4
1 1 3 3

我找到一个solution来顺时针旋转它:

<?php    
$a = array(array(1,2,3,4),array(5,6,7,8),array(9,0,1,2),array(3,4,5,6));
$b = array(); //result

while(count($a)>0)
{
    $b[count($a[0])-1][] = array_shift($a[0]);
    if (count($a[0])==0)
    {
         array_shift($a);
    }
}
?>

事情是,即使a是一维的或只有一个元素,这也必须有效。

因此,1 2 3 4将成为:

4
3
2
1

3 个答案:

答案 0 :(得分:12)

$b = call_user_func_array(
    'array_map',
    array(-1 => null) + array_map('array_reverse', $a)
);

我会把它作为练习让读者弄明白 它是如何工作的。

答案 1 :(得分:0)

这是一个顺时针和逆时针矩阵旋转的解决方案:

$a = array(array(1,2,3,4),array(5,6,7,8),array(9,0,1,2),array(3,4,5,6));
$b = $a; //result

$clockwise = false;  // toggle for clockwise / counter-clockwise

$rows = count($a);
$columns = ($rows > 0) ? count($a[0]) : 0;

for ($y = 0; $y < $rows; $y++) {
  for ($x = 0; $x < $columns; $x++) {
    $newX = $clockwise ? $y                  : ($rows - 1) - $y;
    $newY = $clockwise ? ($columns - 1) - $x : $x;
    $b[$newX][$newY] = $a[$x][$y];
  }
}

答案 2 :(得分:0)

这是一种递归方式:

            $m = array();
            $m[0] = array('a', 'b', 'c');
            $m[1] = array('d', 'e', 'f');
            $m[2] = array('g', 'h', 'i');
            $newMatrix = array();

            function rotateMatrix($m, $i = 0, &$newMatrix)
            {
                foreach ($m as $chunk) {
                    $newChunk[] = $chunk[$i];
                }
                $newMatrix[] = array_reverse($newChunk);
                $i++;

                if ($i < count($m)) {
                    rotateMatrix($m, $i, $newMatrix);
                }
            }

            rotateMatrix($m, 0, $newMatrix);
            echo '<pre>';
            var_dump($newMatrix);
            echo '<pre>';