Как я могу повернуть 2d массив в php на 90 градусов

Я хочу повернуть матрицу на 90 градусов по часовой стрелке. Это равносильно тому, что первый столбец ввода будет входить в первую строку вывода, второй столбец ввода — в 2-ю строку вывода, а 3-й столбец ввода — в 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?

7

Решение

У 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

Другие решения

Я показал вам, как транспонировать массив в ответ на предыдущий вопрос, чтобы повернуть на 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);

демонстрация

7

Еще один надежный вариант:

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’s. Может быть, более ясно.

2

Вы можете кратко перенести матричные данные в одну строку, в два этапа. Первый / внутренний array_map() call преобразует данные столбца в данные строки. Второй array_map() Вызов меняет порядок строк данных. * обратите внимание, к счастью для этого случая, оператор сплат (...) распаковывает только проиндексированные элементы, поэтому подготовка данных не требуется.

Код: (демонстрация)

$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]]
0