Как я могу расположить числа в этом шаблоне из стороны в сторону? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь сделать этот шаблон в 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>";  
}

Может кто-нибудь помочь мне, пожалуйста?

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

Ответы [ 12 ]

0 голосов
/ 03 марта 2019
<?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);
        }
    }

?>
0 голосов
/ 14 февраля 2019

Вы можете попробовать этот код.Я использовал функцию 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

Рабочий пример: CLICK! .

0 голосов
/ 16 февраля 2019

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

$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

0 голосов
/ 13 февраля 2019

Вот еще одно простое решение, просто расширяющее метод 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's 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>
0 голосов
/ 13 февраля 2019

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

<?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
0 голосов
/ 12 февраля 2019

Следующий код разделит диапазон от 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;
});

Или вы можете использовать `для`` loop:

for ($i = 4; $i <= 12; $i += 4) {
    echo (($i / 4) % 2) == 0 ? implode(' ', range($i, $i - 3)) . '<br />' : implode(' ', range($i - 3, $i)) . '<br />';
}
0 голосов
/ 12 февраля 2019

Примерно так.

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
    }
}

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

0 голосов
/ 12 февраля 2019

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

$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().

0 голосов
/ 12 февраля 2019

Используя цикл 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>";, если вы просматриваете вывод в браузере.

0 голосов
/ 12 февраля 2019

Я решил выбрать метод 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> тегов, потому что браузеры показывают только один пробел за раз.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...