我正在尝试在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>";
}
有人可以帮我吗?
预先感谢...
答案 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>
标记中,否则在您的浏览器中不会显示字符串填充,因为浏览器一次只显示一个空格。
答案 1 :(得分:7)
使用for
循环和range
与array_reverse
:
<?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;
}
答案 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 .= ' ';
}
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);
}
}
?>