使用php打印星形图案时出现意外结果

时间:2018-05-19 21:03:49

标签: php logic

我正在尝试使用php打印星形图案。我想打印这个:

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

我的代码:

for($i=1; $i<=5; $i++){
    for($j=1; $j<=5; $j++){
        if($j>= (6-$i)){
            echo "*";
        } else {
            echo " ";
        }

    }
    echo "<br>";
}
通过这样做,我应该超越模式,但相反,我得到了这个:

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

任何人都可以告诉我为什么会这样吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

HTML文档中的额外空格字符对渲染输出没有影响。如果查看输出页面源,您将看到正在获得正确的结果。您可以选择以下选项:

1)发送Content-Type: text/plain标题:

header('Content-Type: text/plain');

务必将<br>代码更改为换行符("\n""\r\n"PHP_EOL

2)用<pre>标签

包裹您的所有内容
echo '<pre>';
for($i=1; $i<=5; $i++){
    for($j=1; $j<=5; $j++){
        if($j>= (6-$i)){
            echo "*";
        } else {
            echo " ";
        }

    }
    echo "<br>";
}
echo '</pre>';

3)使用不间断的空格:

for($i=1; $i<=5; $i++){
    for($j=1; $j<=5; $j++){
        if($j>= (6-$i)){
            echo "*";
        } else {
            echo "&nbsp;";
        }

    }
    echo "<br>";
}

另一方面,如果没有额外的for循环和if/else语句,这里的内容将与您尝试执行的内容完全相同:

for ($i=1; $i<=5; $i++) {
    echo str_pad(str_repeat('*', $i), 5, ' ', STR_PAD_LEFT) . PHP_EOL;
}

Try it on 3v4l.org

答案 1 :(得分:0)

老实说,我正在使用str_pad()。但是,如果您需要为类分配使用循环,那么递减$j似乎更容易。

演示:https://3v4l.org/9aY3S

for($i=1; $i<=5; ++$i){
    for($j=5; $j>0; --$j){
        echo $i < $j ? " " : "*";
    }
    echo "\n";
}

当渲染为html时,您需要使用&nbsp;来显示连续的空格,并使用<br>来换行。或者,如果您的字体是为空格和星号提供不同字符宽度的字体,则可以通过更改字体来同步宽度,或使用<span style="visibility:hidden">*</span>作为非星号。

将你的片段带到phptester.net,看看它是如何呈现为html。