星号三角形概述
星号三角形(Star )是PHP循环练习中的经典题型,使用*符号通过嵌套循环打印出各种几何形状。与数字三角形相比,星号三角形的逻辑更集中在控制输出数量和位置,不涉及数字本身的变化。掌握这些图案,对理解二维空间输出、循环边界控制很有帮助。
个人经验:星号图案练习的价值不在于图案本身,而在于训练“把空间想象转化为循环条件”的能力。项目开发中很少需要打印星号,但同样的逻辑在处理表格布局、网格数据时经常用到。
Pattern 1:倒三角形(星号数量递减)
每行星号数量从上到下递减,第1行最多,之后一行最少。
<?php
for ($row = 0; $row <= 5; $row++) {
// 每行星号数量 = 5 - 当前行号
for ($star = 5 - $row; $star >= 1; $star--) {
echo "* ";
}
echo "<br>";
}
?>
输出:
* * * * * *
* * * * *
* * * *
* * *
* *
*
规律:外层$row=0时,内层$star从5到1,输出6个星号(注意<=5共6行)。内层循环的初始值5-$row决定了每行的星号数量。
Pattern 2:正三角形(星号数量递增)
每行星号数量从上到下递增,第1行最少,之后一行最多。
<?php
for ($row = 0; $row <= 5; $row++) {
for ($star = 1; $star <= $row; $star++) {
echo "* ";
}
echo "<br>";
}
?>
输出:
*
* *
* * *
* * * *
* * * * *
注意第1行($row=0)时内层条件$star<=0不成立,输出空行。如果想从1个星号开始,可以把外层循环改为$row=1开始。
Pattern 3:菱形(正三角形+倒三角形,带空格)
这是Pattern 2和Pattern 1的组合,中间加上前置空格实现居中对齐。
<?php
// 上半部分:正三角形
for ($row = 1; $row <= 5; $row++) {
// 输出前置空格(逐行减少)
for ($space = 5; $space >= $row; $space--) {
echo " "; // 两个空格
}
// 输出星号(逐行增加)
for ($star = 1; $star <= $row; $star++) {
echo "* "; // 星号加两个空格
}
echo "<br>";
}
// 下半部分:倒三角形(去掉中间行避免重复)
for ($row = 4; $row >= 1; $row--) {
// 输出前置空格(逐行增加)
for ($space = 5; $space >= $row; $space--) {
echo " ";
}
// 输出星号(逐行减少)
for ($star = 1; $star <= $row; $star++) {
echo "* ";
}
echo "<br>";
}
?>
输出:
*
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
规律:上半部分行号1-5,前置空格逐渐减少,星号逐渐增加;下半部分行号4-1,前置空格逐渐增加,星号逐渐减少。
个人经验:Pattern 3的代码中用了一些空格来调整对齐。实际练习时可以先把空格去掉,输出一个不带居中的V形,然后再逐步添加空格调整位置。分步调试更容易找到问题。
Pattern 4:正三角形+倒三角形(上下拼接,无空格)
两个三角形直接拼接,形成一个菱形的一半效果(实际是正三角加倒三角)。
<?php
// 上半部分:正三角形
for ($row = 1; $row <= 5; $row++) {
for ($star = 1; $star <= $row; $star++) {
echo ' * ';
}
echo '<br>';
}
// 下半部分:倒三角形
for ($row = 5; $row >= 1; $row--) {
for ($star = 1; $star <= $row; $star++) {
echo ' * ';
}
echo '<br>';
}
?>
输出:
*
* *
* * *
* * * *
* * * * *
* * * * *
* * * *
* * *
* *
*
注意中间行(5个星号)出现了两次。
Pattern 5:实心矩形(5x5网格)
一个5行5列的星号矩形,是最基本的二维网格输出。
<?php
for ($row = 1; $row <= 5; $row++) {
for ($col = 1; $col <= 5; $col++) {
echo '* ';
}
echo "<br>";
}
?>
输出:
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
Pattern 6:隔行输出的倒三角形(只显示奇数行)
这个图案只输出奇数行的倒三角形部分,形成一个间断的图案。
<?php
// 上半部分:从第5行向下到第1行,只取奇数行
for ($row = 5; $row >= 1; $row--) {
if ($row % 2 != 0) { // 行号为奇数才输出
for ($star = 5; $star >= $row; $star--) {
echo "* ";
}
echo "<br>";
}
}
// 下半部分:从第2行向上到第5行,只取奇数行
for ($row = 2; $row <= 5; $row++) {
if ($row % 2 != 0) {
for ($star = 5; $star >= $row; $star--) {
echo "* ";
}
echo "<br>";
}
}
?>
输出:
*
* * *
* * * * *
* * *
*
规律:只输出行号为奇数的倒三角形。第5行输出5个星号,第3行输出3个星号,第1行输出1个星号;然后第3行再输出3个星号,第1行输出1个星号。
个人经验:Pattern 6的逻辑稍绕,核心是通过$row % 2 != 0筛选行号。这种“条件输出”的思路在处理需要过滤某些行的场景时很有用。
本节课程知识要点
| 知识点 | 说明 |
|---|---|
| 正三角形 | 内层循环条件$star <= $row,星号数量随行号递增 |
| 倒三角形 | 内层循环条件$star >= 1配合递减初始值,星号数量递减 |
| 前置空格 | 通过额外的内层循环输出空格,实现居中对齐 |
| 菱形拼接 | 正三角形+倒三角形组合,注意中间行不要重复 |
| 矩形网格 | 双层循环都使用固定边界,形成方阵 |
| 条件输出 | 用if($row%2!=0)筛选特定行号 |
六种图案的对比
| 图案 | 形状 | 特殊处理 | 适用练习点 |
|---|---|---|---|
| Pattern 1 | 倒三角形 | 无 | 递减循环 |
| Pattern 2 | 正三角形 | 无 | 递增循环 |
| Pattern 3 | 菱形(带空格) | 前置空格 | 空格控制+上下拼接 |
| Pattern 4 | 上下拼接 | 中间行重复 | 连续两个循环 |
| Pattern 5 | 实心矩形 | 固定边界 | 二维网格 |
| Pattern 6 | 隔行倒三角 | 奇偶筛选 | 条件输出 |
常见错误与排查
错误1:正三角形第一行为空
-
原因:外层循环从0开始,内层
$star<=0不成立 -
解决:从1开始循环,如
for($row=1;$row<=5;$row++)
错误2:菱形图案的上下两部分不对称
-
原因:上下部分的行号范围或空格数量计算不一致
-
解决:先画对称的正三角形和倒三角形,再分别调整空格
错误3:矩形图案中每行星号数量不一致
-
原因:内层循环的边界写成了
$col<=$row -
解决:矩形应该用固定边界,如
$col<=5
个人经验与建议
第一,按难度顺序练习。建议顺序:Pattern 5(矩形)→ Pattern 2(正三角)→ Pattern 1(倒三角)→ Pattern 4(上下拼接)→ Pattern 3(菱形)→ Pattern 6(条件输出)。矩形最简单,菱形相对复杂。
第二,注意空格和星号的比例。Pattern 3用了两个空格和一个星号加两个空格的组合。实际练习时可以先用单个空格调试,对齐后再调整间距。浏览器中空格会合并显示,建议用 或在<pre>标签中预览。
第三,学会拆分复杂图案。Pattern 3的菱形可以看作“上半部分”和“下半部分”两个独立图案的拼接。先分别写出正三角形和倒三角形,再加前置空格,之后拼起来调试。
第四,理解内层循环的边界计算。Pattern 1中5-$row是星号数量,Pattern 3中5>=$i是空格数量。这些计算本质上是在“行号”和“输出数量”之间建立映射关系。把映射公式写出来,代码自然就有了。
第五,关于Pattern 6。这个图案的实际应用价值不大,主要是训练条件判断和循环的结合。如果觉得理解困难,可以先跳过,把前面的基础图案练熟。