Как я могу расположить числа в этом шаблоне из стороны в сторону?

Я пытаюсь сделать этот шаблон в PHP:

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

Я попробовал это, но безуспешно:

$num = 0;
for ($i=0; $i<=2; $i++) {  
    for ($j=1; $j<=5; $j++) {  
        $num = $j - $i+$num;
        echo $num.""; 
        $num--;
    }  
    echo "</br>";  
}

Кто-нибудь может мне помочь?

Заранее спасибо...

Ответы

Ответ 1

Вот самый простой и быстрый код, который я смог сделать, используя два цикла. Это легче с тремя циклами, и есть несколько способов добиться этого, но вот самый простой, по моему мнению.

<?php

$num = 1;
$change = true;
$cols = 5;
$rows = 5;

for ($i = 0; $i < $rows; $i++) {
    if (!$change) {
        $num += ($cols - 1);
    }

    for ($j = 0; $j < $cols; $j++) {
        echo $num . " ";
        if (!$change) {
            $num--;
        } else {
            $num++;
        }
    }

    if (!$change) {
        $num += ($cols + 1);
    }

    $change = !$change;
    echo "<br>";
}

ПРИМЕЧАНИЕ. Вы должны определить количество столбцов в переменной $cols. Это будет работать в любом случае.

Ответ 2

Я решил выбрать метод array_chunk для создания "строк", которые затем перебираю.

$max = 13; // The last number
$cols = 4; // The point at which a new line will start
$arr = array_chunk(range(1, $max), $cols); // Magic ;D

// Print the data.
foreach ($arr as $key => $row) {
    // In case we are wrapping on the far side, this will prevent the row from
    // starting on the left.
    $row = array_pad($row, $cols, ' ');

    // This will reverse every other row
    $row = ($key % 2 === 0) ? $row : array_reverse($row);

    foreach ($row as $value) {
        $value = str_pad($value, strlen($max), ' ', STR_PAD_LEFT);
        echo "{$value} ";
    }
    echo "<br />";
}

Выход:

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

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

Заполнение строк не будет отображаться в вашем браузере, если вы не заключите вывод в теги <pre> потому что браузеры показывают только один пробел за раз.

Код в действии

Ответ 3

Используя цикл for и range с array_reverse:

https://3v4l.org/7QMGl

<?php

$number = 25;
$columnCount = 4;

for($i = 1, $loopCounter = 1; $i <= $number; $i = $i + $columnCount, $loopCounter++) {
    $range = range($i, $i+$columnCount - 1);

    if($loopCounter % 2 === 0) {
        $range = array_reverse($range);
    }

    foreach($range as $n) {
        echo str_pad($n, 2, ' ', STR_PAD_LEFT) . " ";
    }

    echo "\n";

}

Мы увеличиваем $i на $columnCount на каждой итерации, поэтому мы всегда можем сгенерировать массив из диапазона чисел, которые должны быть выведены в этой строке. Это делает это очень простым и понятным, если мы должны обратить номера строки.

str_pad помогает нам поддерживать правильный интервал, например, для одной цифры

Примечание. Возможно, вам придется заменить echo "\n"; для echo "<br>"; если вы смотрите на вывод в браузере.

Ответ 4

Просто чтобы добавить короткую версию...

$columns = 4;
$rows = 3;
foreach ( array_chunk(range(1,$columns * $rows), $columns) as $row => $line )    {
    echo implode(" ", ($row % 2 == 0 )?$line:array_reverse($line) )."<br />";
}

Идея состоит в том, чтобы использовать range для создания чисел в массиве, а затем использовать array_chunk чтобы разбить его на строки. Затем используйте implode() для вывода строк - с нечетным числом строк, перевернутых с помощью array_reverse().

Ответ 5

Это очень просто, и вам не нужно использовать функции массива, просто математика:

$rows = 4;
$cols = 4;
for ($row = 0; $row < $rows; $row++) {
    for ($col = 0; $col < $cols; $col++) {
        if ($row % 2 === 0) {
            // $row * $cols + 1 gives you first number for that row
            // e.g. for row number 2 you get 2 * 4 + 1 = 9
            $num = $row * $cols + 1 + $col;
        } else {
            // ($row + 1) * $cols gives you last number for that row
            // e.g. for row number 1 you get (1 + 1) * 4 = 8
            $num = ($row + 1) * $cols - $col;
        }
        echo sprintf('%2d ', $num);
    }
    echo PHP_EOL;
}

Демо на IDEONE

Ответ 6

Следующий код разделит диапазон от 1 до 12 на порции по 4. Затем он будет проходить через эти порции и печатать их вперед или назад поочередно.

$forward = true;
array_walk(array_chunk(range(1, 12), 4), function ($a) use (&$forward) {
    echo $forward ? implode(' ', $a)  . '<br />' : implode(' ', array_reverse($a)) . '<br />';
    $forward = $forward ? false : true;
});

Или вы можете использовать цикл for:

for ($i = 4; $i <= 12; $i += 4) {
    echo (($i / 4) % 2) == 0 ? implode(' ', range($i, $i - 3)) . '<br />' : implode(' ', range($i - 3, $i)) . '<br />';
}

Ответ 7

Вот еще одно простое решение, просто расширяющее метод OP. Вы можете попробовать его с разными размерами строк и столбцов, изменив значения для первых двух переменных.

<?
    $row_count = 3; //You can change this value depending to how many rows do you want to print
    $column_count = 4; //You can change this value depending to how many columns will be at each row

    $result = ''; //Variable to hold the output to print
    $num = 0; //Variable to hold temporary value for each element
    for ($i=1; $i<=$row_count; $i++) {
        //Every row
        for ($j=1; $j<=$column_count; $j++) {  
            //Every column
            if($i % 2 == 1) {
                //If row number is odd, increment the value starting from maximum element of previous row
                $num = (($i - 1) * $column_count) + $j;
            }
            else {
                //If row number is even, decrement the value starting from maximum element of current row
                $num = ($i * $column_count) - ($j - 1);
            }
            //Add calculated number to output with  extra space if it length is short
            $result .= $num . addSpace($row_count, $column_count, $num); 
        }  
        $result .= '</br>';  
    }

    //Method to add spaces after number to provide a matrix-like template for the output
    function addSpace($row_count, $column_count, $current_number) {
        $space = ' ';
        $max_number = $row_count * $column_count;
        $max_length = strlen($max_number);
        $current_number_length = strlen($current_number);
        for($digit=$current_number_length; $digit<$max_length; $digit++) {
            $space .= '&nbsp;';
        }
        return $space;
    }

?>

<html>
    <head>
        <style type="text/css">
            body{
                font-family: Courier;
            }
        </style>
    </head>
    <body>
        <? echo $result; ?>
    </body>
</html>

Ответ 8

$number = 12;
$elements_per_row = 4;
$left_to_right = true;
$processed_number_count = 0;
$result_array = [];
$temp = [];
for ($i=1; $i<=$number; $i++) {
    $temp[] = $i;
    $processed_number_count++;
    if ($processed_number_count === $elements_per_row) {
        $processed_number_count = 0;
        if ($left_to_right) {
            $result_array[] = $temp;
        } else {
            $result_array[] = array_reverse($temp);
        }
        $left_to_right = !$left_to_right;
        $temp = [];
    }
}

var_dump($result_array);

Затем просто с помощью foreach $ result_array выведите нужный шаблон

Это может использоваться по-разному для многих других шаблонов, которые используют то же правило, изменяя $ number и $ elements_per_row

Ответ 9

Что-то вроде этого.

bool forwardReverse = false;
int width = 4;
string line = "";
for (int i = 1; i < maxValue; i++)
{
    if (i % width == 0)
    {
        forwardReverse = !forwardReverse;
    Console.WriteLine(line);
    line = "";
    }

    if (forwardReverse)
    {
        line = line + i;        
    }
    else
    {
        line = i + line
    }
}

Каждый раз, когда вы добираетесь до конца строки (ширины), логический флаг изменяется, и порядок добавления новых значений переключается между добавлением и добавлением.

Ответ 10

В значительной степени Найджел отвечает: пройдите через отрезанный кусок, повторяя каждый ряд, переворачивая каждый другой:

<?php
$cols = 4;
$rows = 3;
array_walk(
    array_chunk(
        range(1, $rows*$cols),
        $cols
    ),
    function($v, $k) {
        if($k%2)
            $v = array_reverse($v);
        echo implode(' ', $v), "\n";
    }
);

Выход:

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

Ответ 11

Вы можете попробовать этот код. Я использовал функцию array_map чтобы правильно добавить отступ перед числами:

<?php

$min = 1;
$max = 12;
$cols = 4;

$chunkedArray = array_chunk(range($min, $max), $cols);

foreach ($chunkedArray as $index => $row) {
    $dataToShow = $index % 2 == 0 ? $row : array_reverse($row);
    $dataToShow = array_map(function($element) use ($max) {
        return str_pad($element, strlen($max), ' ', STR_PAD_LEFT);
    }, $dataToShow);

    echo implode(' ', $dataToShow) . PHP_EOL;
}

Выход:

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

Рабочий пример: НАЖМИТЕ! ,

Ответ 12

<?php
   $numbers = array(1, 2, 3, 4);
   $flag = false;
   result($numbers, $flag);

   function printMe(&$array2){
    foreach($array2 as $index => $value){
    echo $value."   ";
    }
    echo "<br>";
   }

   function reverse(&$num, $flag)
   {
    if($flag){
    array_reverse($num, true);
    }
    $flag = false;
   }
    function add(&$array){
          $array[0] += 4;     
          $array[1] += 4; 
          $array[2] += 4; 
          $array[3] += 4; 
    }
    function result($numbers, $flag){
        for($i = 0; $i < 3; $i++ )
        {
            reverse($numbers, $flag);
            printMe($numbers);
            add($numbers);
        }
    }

?>