Задать вопрос
@sgidlev

Как вывести числа от 1 до 10 равномерно в 3 колонки?

Приветствую. Помогите вывести числа от 1 до 10 равномерно в 3 колонки?

Т.е. должно получится
1 5 8
2 6 9
3 7 10
4

Вот мой код но выводит немного неправильно

//  исходные данные
$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>';


У меня получается
1 5 9
2 6 10
3 7
4 8
  • Вопрос задан
  • 718 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 3
Immortal_pony
@Immortal_pony Куратор тега PHP
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
*/
Ответ написан
@ksnk
// генерируем данные
$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";
}
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
<?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";
}
?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
TrogWarZ
@TrogWarZ
web developer
Идея: сначала создать двумерную матрицу из последовательности, а затем транспонировать её.

Ну и примерное решение:
// 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);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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