Светоотражающий рисунок чисел в строках и столбцах html-таблицы с использованием циклов - PullRequest
0 голосов
/ 26 марта 2019

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

Я уже пробовал, но вывод выглядит так:

|0|1|2|
|0|1|2|
|0|1|2|

Этомой код:

<?php
echo "<table border =\"1\" style='border-collapse: collapse'>";
for ($row=1; $row <= 3; $row++) { 
    echo "<tr> \n";

    for ($col=1; $col <= 3; $col++) { 
        $p = $col-1;
        echo "<td>$p</td> \n";
    }

    echo "</tr>";
}

echo "</table>";
?>

Я ожидал этого результата:

|0|1|0|
|1|2|1|
|0|1|0|

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

Ответы [ 3 ]

0 голосов
/ 26 марта 2019

этот код будет делать то, что вы хотите, просто call функция patternGenerator с количеством различных чисел, которые вы хотите для вашего примера, эти числа равны 3 (0,1,2).

идея в этом коде состоит в том, чтобы использовать два for loops, один из которых начинается с минимального числа до максимального, а другой - после максимального числа, уменьшающегося до минимума.

например: если min = 0 и max = 5 первый loop напечатает 0,1,2,3,4,5 а второй напечатает 4,3,2,1,0 и это все.

сначала я создал функцию, которая создает только в строке с именем rowGenerator, она принимает $min и $max как parameters и печатает одну строку поэтому, если мы хотим напечатать строку, подобную этой: |0|1|0|, тогда мы будем вызывать эту функцию с min = 0 и max = 1 и если мы хотим напечатать строку, подобную этой: |1|2|1|, тогда мы назовем ее с min = 1 и max = 2.

function rowGenerator($min, $max)
{
    echo '<tr>';

    for($i = $min; $i<=$max;$i++)
        echo '<td>'.$i.'</td>';

    for($i = $max-1; $i>=$min;$i--)
        echo '<td>'.$i.'</td>';

    echo '</tr>';   
}

на данный момент мы можем печатать каждую строку независимо. Теперь мы хотим напечатать всю таблицу, если мы посмотрим на вызовы, которые мы делаем для функции rowGenerator, она будет выглядеть следующим образом:

(min = 0, max = 1), (min = 1, max = 2) и (min = 0, max = 1). минимумы равны (0,1,0). да, опять та же картина. затем нам нужно два loops, снова один, чтобы начать с 0 и увеличивать число до достижения 1, а другой - для цикла с 0 до 0.

и вот что произошло в функции patternGenerator. когда вы набираете номер с разными номерами, function просто получает min, который всегда будет 0 в вашем случае и max.

function patternGenerator($numberOfDistinct )
{
    echo "<table border =\"1\" style='border-collapse: collapse'>";
    $min = 0;
    $max = $numberOfDistinct - 2;
    for($i = $min;$i<=$max; $i++)
    {
        rowGenerator($i,$i+1);
    }
    for($i = $max-1;$i>=$min;$i--)
    {
        rowGenerator($i,$i+1);
    }
    echo '</table>';

}

это вывод вызова patternGenerator(3):

result of calling patternGenerator(3)

вывод вызова patternGenerator(5):

result of calling patternGenerator(5)

0 голосов
/ 26 марта 2019

Сначала объявите квадратный корень из числа ячеек таблицы. Другими словами, если вам нужна ячейка размером 5 на 5 (25 ячеек), объявите $size = 5

Так как ваши числа начинаются с нуля, самое высокое целое число должно быть $size - 1 - я назову это $max.

Я поддерживаю ваш дизайн вложенных циклов, и переменные имеют соответствующие имена $row и $col.

Внутри этих циклов вам просто нужно провести различие между вашими "счетчиками", которые выше или меньше половины значения $max. Если оно больше $max / 2, вы вычитаете «счетчик» (например, $row или $col) из $max.

Суммируя два потенциально скорректированных «счетчика» и печатая их внутри своего внутреннего цикла, вы генерируете желаемый шаблон (или, по крайней мере, шаблон, который, я думаю, вам нужен). Это решение будет работать для $size значений от 0 и выше - поиграйте с моей демонстрационной ссылкой.

Код: ( Демо )

$size = 5;
$max = $size - 1;
echo "<table>\n";
for ($row = 0; $row < $size; ++$row) {
    echo "\t<tr>";
    for ($col = 0; $col < $size; ++$col) {
        echo "<td>" . (($row >= $max / 2 ? $max - $row : $row) + ($col >= $max / 2 ? $max - $col : $col)) . "</td>";
    }
    echo "</tr>\n";
}
echo "</table>";

Выход:

<table>
    <tr><td>0</td><td>1</td><td>2</td><td>1</td><td>0</td></tr>
    <tr><td>1</td><td>2</td><td>3</td><td>2</td><td>1</td></tr>
    <tr><td>2</td><td>3</td><td>4</td><td>3</td><td>2</td></tr>
    <tr><td>1</td><td>2</td><td>3</td><td>2</td><td>1</td></tr>
    <tr><td>0</td><td>1</td><td>2</td><td>1</td><td>0</td></tr>
</table>
0 голосов
/ 26 марта 2019

Есть много способов достичь этого.

Простой способ сделать это;

<?php
$baseNumber = 0;

echo "<table border='1' style='border-collapse: collapse'>";
for ($row = 0; $row < 3; $row++) {
    echo "<tr>";

    if ($row % 2 !== 0) {
        $baseNumber++;
    } else {
        $baseNumber = 0;
    }

    for ($col = 0; $col < 3; $col++) {
        echo "<td>" . ($col % 2 === 0 ? $baseNumber : $baseNumber + 1) . "</td>";
    }

    echo "</tr>";
}

echo "</table>";
...