3

私はより大きな問題を解決しており、あるステップで 2D 配列を反時計回りに回転させる必要があります。

したがって、このマトリックスがある場合:

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

時計回りに回転させる解決策を見つけました:

<?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 次元または 1 つの要素しかない場合でも機能する必要があるということです。

したがって、次の1 2 3 4ようになります。

4
3
2
1
4

3 に答える 3

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

読者がそれがどのように機能するかを理解するための演習として残しておきます。

于 2013-06-08T08:45:50.003 に答える
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];
  }
}
于 2013-06-08T08:54:28.813 に答える