// исходные данные
$elems = 10;
$array = array();
for ($q = 1; $q <= $elems; $q++)
$array[] = $q;
$categories = $array;
$columns = 3;
$rows = 4;
echo '<table>';
for ($row = 0; $row < $rows; $row++) {
echo '<tr>';
foreach ($categories as $k => $category) {
if ($k % $rows == $row) {
echo '<td>' . $category . '</td>';
}
}
echo '</tr>';
}
echo '</table>';
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
*/
// генерируем данные
$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";
}
<?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";
}
?>
// Functions
function matrixFromRange($begin, $end, $cols)
{
$matrix = range($begin, $end);
$result = [];
$i = 0;
$chunk = ceil(count($matrix) / $cols);
foreach ($matrix as $el) {
$result[$i][] = $el;
if (!($el % $chunk)) $i++;
}
return $result;
}
function matrixTranspond(array $matrix = [])
{
$result = [];
foreach ($matrix as $i => $j)
foreach ($j as $k => $m)
$result[$k][$i] = $m;
return $result;
}
function matrixEcho(array $matrix = [], $rowsGlue = ' ', $colsGlue = PHP_EOL)
{
foreach ($matrix as $el)
echo implode($rowsGlue, $el) . $colsGlue;
}
// Config
$numBegin = 1;
$numEnd = 25;
$cols = 3;
$joinRowsWith = ' ';
$joinColsWith = PHP_EOL;
// Testing
$matrix = matrixFromRange($numBegin, $numEnd, $cols);
$transponded = matrixTranspond($matrix);
matrixEcho($transponded);