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

Я хочу повернуть матрицу на 90 градусов по часовой стрелке. Это сводится к тому, что первый столбец ввода вводит первую строку вывода, второй столбец ввода второй строки вывода и третий столбец ввода третьей строки вывода. Обратите внимание, что нижняя часть столбца = начало строки из-за поворота на 90 градусов.

Например:

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

Я знаю, что я сначала перенести матрицу, а затем поменять столбцы, чтобы повернуть матрицу на 90 градусов. Как это можно применить к php?

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 

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

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

Другой надежный вариант:

 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. Возможно, более ясно.