【问题标题】:PHP nesting for loop inside for loopPHP在for循环中嵌套for循环
【发布时间】:2015-01-28 11:57:25
【问题描述】:

过去 3 个小时一直在尝试解决这个问题,但很难找到任何“在 for 循环中嵌套 for 循环”的搜索结果,所以我必须问这个问题,有人可以帮助澄清一下,就像一个业余爱好者这是一个问题,非常感谢任何和所有的帮助。

所以我在下面有这段代码,对于我在http://www.w3resource.com/php-exercises/php-for-loop-exercises.php 找到的初学者循环练习 关于该页面的问题 3。最终结果也应该在该页面上。

<?php
    for($a = 1; $a <= 5; $a++) {
        for($b = 1; $b <= $a; $b++) {
            echo "*";
            if($b < $a) {
               echo " ";
            }
        }
        echo "<br />";
    }
?>

原来是一个由15个小*组成的三角形

我正试图弄清楚这是如何工作的,因为即使网站有答案,我也想了解,这样我就可以自己写东西而不是复制粘贴。

以下是我在阅读php.net 并尝试在 Google 上寻找解决方案后能够做出的结论。

所以,$a for 循环开始为真,所以循环继续到$b FOR 循环,它是真的,所以它会回显*,此时$b 不是&lt; $a循环还没有结束所以++ 还没有被添加,if 语句是假的,所以我们&lt;br /&gt; 并重新运行循环。

第二次。现在$a=2for 循环仍然正确,所以它将继续到$b for 循环和回显*。这就是我感到困惑的地方。 $b 在其语句的末尾有 ++ ,所以这是否意味着在循环 1 之后 $b = 2if 仍然是 false ?

在我的脑海里,我一直在想它应该像这样打印出来:

&lt;br /&gt;* &lt;br /&gt; * &lt;br /&gt;

而不是这个:

&lt;br /&gt;* &lt;br /&gt; * * &lt;br /&gt;

我的结论。

  1. $b 值将在每次循环后重置回 1 并不断重复,直到 if 语句为 false。

  1. 被打印出来的* 被存储起来,并将成为每个循环开始时的自动起点。我知道,如果为 for($i=0;$i&lt;11;$i++) 循环执行简单的打印将传递该值,但是在我的情况下,打印的 * 不是一个值,因此不应将其传递到新循环。李>

  1. 我完全不同意我的两个结论。

不管怎样,这让我很困惑。

抱歉,解释太长了。

谢谢。

【问题讨论】:

  • 您现在有什么问题?就像这是如何工作的?
  • 替换回声“”;用回声“&nbsp”;因为 html 将多个空格视为空格并将它们评估为单个空格
  • 这个问题属于codereview
  • 嘿 @Rizier123 ,是的,很抱歉让您感到困惑,我发现很难理解这是如何工作的。我已经写下了 2 个结论,说明为什么我认为这行得通,但不确定其中任何一个是否正确。我知道我在询问一个工作代码块很奇怪,但它让我非常烦恼,以至于我不知道它为什么工作=\

标签: php for-loop nested-loops


【解决方案1】:

让我们一步一步来

外环

   for($a = 0; $a <= 5; $a++) {
      //inner loop  here
      echo "<br>";  //after the inner loop has executed, start a new line
    }

从 0 开始,到 5 并执行里面写的任何操作。现在这意味着每次迭代都会发生两件事

1) 每次外循环迭代都会执行内循环

2) 外循环的每次迭代都会打印一个 HTML 换行符

现在内循环做了什么?

    for($b = 1; $b <= $a; $b++) {
        echo "*";
            if($b < $a) {
                echo " "; // $b<$a means we still have more stars to print on this line
            }
    }

从 1 开始,上升到 $a 的值,这个 $a 将来自外部循环,第一次运行时为 1,第二次运行时为 2,直到 5。在执行此操作时,打印一个 @ 987654325@;这意味着第一次将打印 1 星,因为循环将从 1 开始并在 1 结束。第二次 2 星,第三次 3 星,依此类推。

现在在打印完星之后,看看这是否是这次迭代必须打印的最后一个星,如果不是,则打印一个空格,以便下次打印星之间有一个空格。

就是这样 :) 请注意,您的外循环从 1 开始,它应该从 0 开始以正确形成所需的形状。

现在,如果您仍然对 $b&lt;$a 的事情感到困惑,只需摆脱它并再次运行您的代码,您会发现除了星号之间没有空格之外没有任何变化,而且会更容易一些了解

    for($b = 1; $b <= $a; $b++) {
        echo "*";
    }

哦,++ 在变量之后意味着将其值增加 1。在 for 循环中,这意味着在下一次运行时将计数器的值加 1。你也可以写成

for($a=0; $a<=5; $a=$a+1)      // thats the same as $a++;

如果你想让值增加超过 1,你可以说

for($a=0; $a<=5; $a=$a+2)    // a will be 0 , 2, 4

Fiddle

【讨论】:

  • 嗨@Hanky 웃 Panky,感谢您的精彩回复,非常感谢您抽出宝贵时间提供帮助!我只是对一些我仍然难以理解的事情有进一步的问题。让我们说例如第二个循环。现在 $a=2 和 $b=1。 PHP 怎么知道要打印两个 * 星?要重新运行循环,不会 $b 只需要打印一个 * 以便 $b 将 =$a。还是它从上一个循环中继承了 1 星?
  • 嗨 Hanky Panky,对不起,我的意思是我的评论打错字了:让我们说例如第二个循环。现在 $a=1 和 $b=2
  • 其实我现在明白了哈哈,终于谢天谢地了。谢谢你的帮助,你太棒了! :)
  • $a=1, $b=2 表示从 1 开始,一直到 2,这意味着运行 2 次,因此您理解正确的是两颗星 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2020-10-09
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多