使用循环 html table 的行和列中数字的反射模式

Reflective pattern of numbers in rows and columns of html table using loops

我一直在尝试使用嵌套循环从数字中制作反射图案。

我已经试过了,但输出是这样的:

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

每一列和每一行的单元格值必须增加到给定的数量然后减少以形成镜像/回文序列。

有很多方法可以实现。

一个简单的方法是;

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

此代码将执行您想要的 call patternGenerator 函数以及您想要的不同数字的数量,对于您的示例,这些数字是 3 (0,1,2)。

这段代码的想法是使用两个for loops一个从最小数开始到最大数,另一个从最大数开始递减到最小数。

例如: 如果 min = 0max = 5 第一个 loop 将打印 0,1,2,3,4,5 第二个将打印 4,3,2,1,0 就是这样。

首先,我创建了一个函数,它只在名为 rowGenerator 的行上创建它需要 $min$max 作为 parameters 并打印一行 所以如果我们想像这样打印一行: |0|1|0| 那么我们将用 min = 0max = 1 调用这个函数,然后 如果我们想像这样打印一行:|1|2|1| 那么我们将使用 min = 1max = 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>';   
}

现在,我们可以独立打印每一行。现在我们要打印整个 table 如果我们查看我们对 rowGenerator 函数所做的调用,它将如下所示:

(min = 0, max = 1), (min = 1, max = 2) 和 (min = 0max = 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) 的输出:

调用patternGenerator(5)的输出:

首先声明 table 细胞计数的平方根。换句话说,如果您想要 5×5 单元格 table(25 个单元格),请声明 $size = 5

由于您的数字是从零开始的,因此显示的最大整数应该是 $size - 1 -- 我将其称为 $max

我支持你的嵌套循环设计,变量被恰当地命名为 $row$col

在这些循环内部,您只需要区分 "counters" 是高于还是低于 $max 值的一半。如果它高于 $max / 2,则从 $max.

中减去 "counter"(例如 $row$col

通过将两个可能调整的 "counters" 相加并在您的内部循环中打印它们,您可以生成所需的模式(或者至少是我认为您想要的模式)。此解决方案适用于 0 及更高的 $size 值——试一试我的演示 link.

代码:(Demo)

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