如何以这种并排方式排列数字?

时间:2019-02-12 14:44:57

标签: php loops numbers

我正在尝试在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 :(得分:7)

我决定选择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>标记中,否则在您的浏览器中不会显示字符串填充,因为浏览器一次只显示一个空格。

Code in action

答案 1 :(得分:7)

使用for循环和rangearray_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>";

答案 2 :(得分:5)

这是我使用两个循环制作的最简单,最快的代码。三个循环比较容易,有多种方法可以实现这一点,但是对我来说,这是最简单的一种。

<?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变量中定义列数。在任何情况下都可以使用。

答案 3 :(得分:5)

只需添加一个简短版本...

$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()反转奇数行。

答案 4 :(得分:4)

这非常容易,您不需要使用数组函数,只需进行一些数学运算即可:

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

Demo on IDEONE

答案 5 :(得分:3)

以下代码将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 />';
}

答案 6 :(得分:3)

这只是扩展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>

答案 7 :(得分:2)

$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);

然后简单地让每个$ result_array打印所需的图案

通过修改$ number和$ elements_per_row

,这可以用于许多使用相同规则的其他模式。

答案 8 :(得分:2)

这样的事情。

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

每次到达行尾(宽度)时,布尔标志都会更改,添加新值的顺序会在追加和前置之间切换。

答案 9 :(得分:2)

奈杰尔(Nigel)的答案差不多,遍历一个分段范围,回荡每一行,彼此反转:

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

答案 10 :(得分:2)

您可以尝试使用此代码。我使用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!

答案 11 :(得分:0)

<?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);
        }
    }

?>