Обычно я спросил бы, как повернуть что-то вроде этого:
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;
}
Просто пройдите по массиву в правильном порядке. Предполагая, что у вас относительно небольшие массивы, самое простое решение - просто создать новый массив во время этой прогулки.
Решение будет иметь вид:
$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;
}
}
}
пожалуйста. Оно работает. :)
$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);