在PHP中使用多个For循环制作的星号内置,ASCII艺术金字塔中错位的行

问题描述

这是我的代码,我需要修复此金字塔,在这里您可以看到显示内容代码
问题是

         *        * *//these i want to fix
       *   *
      *     *
     *       *
    *         *
   *           *
  *             *
 *               *
*                 *
$n = 10;
for ($i = 1; $i <= $n; $i++)
{
    for ($j = 0; $j < ($n - $i); $j++)
        echo " ";
    echo "*";
    for ($j = 1; $j <= $i-1; $j++)
        echo " ";
    for ($k = 1; $k < $i-1; $k++)
        echo " ";
    if($i!=1)
        echo "*</br>";
}

Demo of Broken Code

解决方法

在第一个if($i!=1) for循环的末尾有$i作为条件。实际上,这实际上需要移至第一个sub-for循环。

这是为什么?那么,您的$i for循环正在打印两个*。不过,在金字塔的顶部,您只有一个*符号。在这种情况下,我们需要排除在那种情况下的显示,但仅限于那种情况。

Full Working Demo.

$n = 10;
for ($i = 1; $i <= $n; $i++)
        {
            for ($j = 0; $j < ($n - $i); $j++)
                echo " ";
                if($i!=1) {
                    echo "*";
                }
            for ($j = 1; $j <= $i-1; $j++)
                echo " ";
            for ($k = 1; $k < $i-1; $k++)
                echo " ";
                echo "*\n";
        }

完整输出:

         *
        * *
       *   *
      *     *
     *       *
    *         *
   *           *
  *             *
 *               *
*                 *

您有两个流浪*显示。第二个是由于$i == 1$i的第一个for循环中显示之后的情况引起的,第一个是由于不忽略{{1}的第一种情况的*符号引起的}在$i for循环中。

,

play for example


<?php
for ($i = 0; $i < 15; $i++) {

    echo str_repeat(' ',15-$i). "*" . str_repeat(' ',2*$i) . "*\n";
}

echo ' '.str_repeat('*',31)."\n";
,

if ($i != 1)$i为1时跳过新行的输出,这就是为什么第二行仍在第一行输出的原因。如果您更改输出<br>的逻辑,它将起作用。

$n = 10;
for ($i = 1; $i <= $n; $i++)
{
    for ($j = 0; $j < ($n - $i); $j++) {
        echo " ";
    }
    echo "*";
    for ($j = 1; $j <= $i-1; $j++) {
        echo " ";
    }
    for ($k = 1; $k < $i-1; $k++) {
        echo " ";
    }
    
    if ($i != 1) {
        echo "*";
    }
    echo "<br>";
}
         *
        * *
       *   *
      *     *
     *       *
    *         *
   *           *
  *             *
 *               *
*                 *