PHP - как зеркально отразить строки и столбцы 2D массива

Обычно я спросил бы, как повернуть что-то вроде этого:

1      2        3
4      5        6
7      8        9
10    11       12

В это:

1   4   7   10
2   5   8   11
3   6   9   12

Но на самом деле я хочу превратить его в это:

1   5   9
2   6   10
3   7   11
4   8   12

Другими словами, я хочу зеркально отразить строки и столбцы, но сохранить ту же "ширину" и "высоту" нового массива. Я застревал на этом больше часа.

Это - функция, которую я использую, чтобы сделать нормальное "зеркальное отражение" (первый пример):

function flip($arr)
{
    $out = array();

    foreach ($arr as $key => $subarr)
    {
            foreach ($subarr as $subkey => $subvalue)
            {
                 $out[$subkey][$key] = $subvalue;
            }
    }

    return $out;
}
9
задан Gnuffo1 8 February 2010 в 12:21
поделиться

2 ответа

Просто пройдите по массиву в правильном порядке. Предполагая, что у вас относительно небольшие массивы, самое простое решение - просто создать новый массив во время этой прогулки.

Решение будет иметь вид:

$rows = count($arr);
$cols = count($arr[0]); // assumes non empty matrix
$ridx = 0;
$cidx = 0;

$out = array();

foreach($arr as $rowidx => $row){
    foreach($row as $colidx => $val){
        $out[$ridx][$cidx] = $val;
        $ridx++;
        if($ridx >= $rows){
            $cidx++;
            $ridx = 0;
        }
    }
}
10
ответ дан 4 December 2019 в 10:32
поделиться

пожалуйста. Оно работает. :)



$input1 = array(1,2,3);
$input2 = array(4,5,6);
$input3 = array(7,8,9);
$input4 = array(10,11,12);

$input = array($input1,$input2,$input3,$input4);

echo "\n input array";print_r($input);

// flipping matrices
$output = array();
$intern = array();

for($row=0; $row lt 4; $row++)
    for($col=0;$col lt 3;$col++)
        $intern[] = $input[$row][$col];

echo "\n intern ";print_r($intern);

// nesting the array
$count = 0;
$subcount = 0;

foreach($intern as $value)
{

    $output[$count][$subcount] = $value;
    $count++;

    if($subcount == 3)
    {
        break;
    }

    if($count == 4)
    {
        $count = 0;
        $subcount++;
    }


}


echo "\n final output ";print_r($output);
0
ответ дан 4 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: