<?php
$n = 10;
$cols = 3;
$step = floor($n/$cols); // Основной шаг между колонками
$long = $n%$cols; // Количество длинных колонок
$rows = $step+($long > 0 ? 1 : 0); // Количество строк
for ($i = 1; $i <= $rows; $i++) {
$val = $i; // Начальное значение строки
$col = ($i == $rows ? $long : $cols); // Количество колонок в строке
for ($j = 0; $j < $col; $j++) {
print "{$val}\t";
$val += $step+($j < $long ? 1 : 0); // Шаг к следующей колонке в строке
}
print "\n";
}
?>
// генерируем данные
$elems = 10;
$column = 3;
$array = array();
for ($i = 1; $i <= $elems; $i++)
$array[] = $i;
// нарезка на столбики
$cols = array();
while ($column > 1 + count($cols)) {
$last = floor(count($array) / ($column - count($cols)));
list($array, $tail) = array_chunk($array, count($array) - $last);
$cols[] = $tail;
}
$cols[] = $array;
// выводим
for ($i = 0; $i < count($array); $i++) {
for ($j = $column - 1; $j >= 0; $j--) {
if (isset($cols[$j][$i])) echo $cols[$j][$i] . ' ';
}
echo "\n";
}
function splitByCols($array, $columnsQuantity=3) {
$splitted = [];
$rows = floor(count($array)/$columnsQuantity);
$offset = 0;
$modulo = count($array)%$columnsQuantity;
// Разделение по строкам
for ($i=0; $i<$columnsQuantity; $i++) {
$length = ($i<$modulo ? $rows+1 : $rows);
$columns[] = array_slice($array, $offset, $length);
$offset += $length;
}
// Поворот на 90 градусов
foreach ($columns as $columnIndex=>$rows) {
foreach ($rows as $rowIndex=>$field) {
$splitted[$rowIndex][$columnIndex] = $field;
}
}
return $splitted;
}
// Проверка
$input = range(1,14);
$splitted = splitByCols($input);
foreach ($splitted as $row) {
echo implode(" ", $row);
echo PHP_EOL;
}
/*
Output:
1 6 11
2 7 12
3 8 13
4 9 14
5 10
*/