Транспонирование двумерного массива по диагонали PHP
Есть двумерный массив
$arr1 = [11,12,13,14,15];
$arr2 = [21,22,23,24,25];
$arr3 = [31,32,33,34,35];
$arr4 = [41,42,43,44,45];
$matrix = [$arr1, $arr2, $arr3, $arr4];
Нужно его отзеркалить по основной диагонали.
Чтобы получилось Ну то есть должно получится
$arr1 = [11,15,14,13,12];
$arr2 = [21,22,25,24,23];
$arr3 = [31,32,33,35,34];
$arr4 = [41,42,43,44,45];
Написал вот такую прогу, не работает. В чем проблема?
<?php
$arr1 = [11,12,13,14,15];
$arr2 = [21,22,23,24,25];
$arr3 = [31,32,33,34,35];
$arr4 = [41,42,43,44,45];
$arr5 = [51,52,53,54,55];
$matrix = [$arr1, $arr2, $arr3, $arr4, $arr5];
for ($i=0; $i<count($matrix);$i++)
{
for ($j=0; $j<count($matrix); $j++)
{
if ($j>$i)
{
for ($j=count($matrix[$i])-1; $j>=0; $j--)
{
$reverse[$i][]=$matrix[$i][$j];
}
}
else
{
$reverse[$i][]=$matrix[$i][$j];
}
}
}
for ($k=0;$k<count($reverse);$k++)
{
for ($l=0;$l<count($reverse[$k]);$l++)
{
echo $reverse[$k][$l];
echo ' ';
}
echo '<br>';
}
Ответы (2 шт):
Автор решения: Alpha
→ Ссылка
Если я правильно понял вопрос то это поможет:
$arr1 = [11,12,13,14,15];
$arr2 = [21,22,23,24,25];
$arr3 = [31,32,33,34,35];
$arr4 = [41,42,43,44,45];
$arr5 = [51,52,53,54,55];
$matrix = [$arr1, $arr2, $arr3, $arr4, $arr5];
$reversedArray = array_map(function($innerArray){
return array_reverse($innerArray);
},array_reverse($matrix));
Для вывода:
foreach($reversedArray as $innerArray){
foreach($innerArray as $item){
echo $item . ' ';
}
echo PHP_EOL;
}
Ну и сам результат:
55 54 53 52 51
45 44 43 42 41
35 34 33 32 31
25 24 23 22 21
15 14 13 12 11
Автор решения: девочка с глазами ребёнка
→ Ссылка
Если учитывать, что матрица квадратная, то можно рассмотреть следующее:
Имеем матрицу:
$matrix = [
[11, 12, 13, 14, 15],
[21, 22, 23, 24, 25],
[31, 32, 33, 34, 35],
[41, 42, 43, 44, 45],
[51, 52, 53, 54, 55]
];
Поскольку мы повторяем всю матрицу, происходит отображение, но когда поиск идет ниже диагонали, отражение идет обратно в их первоначальные позиции. Внутренняя петля должна начинаться на $i+1, и это будет держать нас выше диагонали.
for ($i = 0; $i < count($matrix); $i++) {
for ($j = $i + 1; $j < count($matrix); $j++) {
$temp = $matrix[$i][$j];
$matrix[$i][$j] = $matrix[$j][$i];
$matrix[$j][$i] = $temp;
}
}
В результате:
11 21 31 41 51
12 22 32 42 52
13 23 33 43 53
14 24 34 44 54
15 25 35 45 55