Как я могу расположить числа в этом шаблоне из стороны в сторону?
Я пытаюсь сделать этот шаблон в 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 .= ' ';
}
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);
}
}
?>