数字三角形概述
数字三角形(Number )是PHP循环练习中的常见题型,通过嵌套循环控制输出数字的排列方式。这些图案的核心区别在于:外层循环控制行数,内层循环控制每行输出的数字内容和数量。掌握这些模式,对理解二维数据输出、矩阵打印等场景很有帮助。
个人经验:初学嵌套循环时,建议先明确想要的效果(比如第一行几个数、第二行几个数),然后反推循环边界条件。从具体输出反推循环逻辑,比凭空写循环容易得多。
Pattern 1:连续递增数列(顺序填充)
这个图案的特点是数字按顺序连续填充到三角形中,跨行不断开。
<?php
$counter = 1;
for ($row = 0; $row < 4; $row++) {
for ($col = 0; $col <= $row; $col++) {
echo $counter . " ";
$counter++; // 每次输出后自增,保证数字连续
}
echo "<br>";
}
?>
输出:
1
2 3
4 5 6
7 8 9 10
规律:第1行1个数,第2行2个数,第3行3个数,第4行4个数。$counter从1开始,每输出一个数字就加1,整体形成连续数列。
Pattern 2:01交替三角形(奇偶行不同)
这个图案中,每行内数字在0和1之间交替出现。
<?php
for ($row = 0; $row < 5; $row++) {
for ($col = 0; $col <= $row; $col++) {
if ($col % 2 == 0) {
echo "0 "; // 偶数列(第0、2、4…列)输出0
} else {
echo "1 "; // 奇数列(第1、3、5…列)输出1
}
}
echo "<br>";
}
?>
输出:
0
0 1
0 1 0
0 1 0 1
0 1 0 1 0
规律:每行都是从0开始,然后在0和1之间切换。注意这里用的是$col % 2判断,跟行号$row无关。所以每行的模式都是0、1、0、1……
个人经验:Pattern 2里的$k变量其实是多余的。原示例中先定义$k=1然后在循环内根据条件改成0或1,不如直接在if/else里输出具体的0和1更直观。简化后的代码更容易理解。
Pattern 3:逐行递增数字(每行从1开始)
每行输出的数字从1开始递增到当前行号。
<?php
for ($row = 1; $row <= 5; $row++) {
for ($col = 1; $col <= $row; $col++) {
echo $col; // 输出列号,不是行号
}
echo "<br>";
}
?>
输出:
1
12
123
1234
12345
规律:第1行输出1,第2行输出1、2,第3行输出1、2、3……内层循环输出的是$col的值(从1递增),而不是固定的数字。
Pattern 5:全1三角形(正三角形)
每行输出相同数字1,行数决定每行1的个数。
<?php
for ($row = 1; $row <= 5; $row++) {
for ($col = 1; $col <= $row; $col++) {
echo "1";
}
echo "<br>";
}
?>
输出:
1
11
111
1111
11111
规律:最简单的正三角形图案,内层循环只负责控制输出次数,不涉及数字变化。
Pattern 6:全1倒三角形(正三角形反转)
每行输出1,但数量从上到下递减。
<?php
for ($row = 0; $row <= 5; $row++) {
for ($col = 5 - $row; $col >= 1; $col--) {
echo "1";
}
echo "<br>";
}
?>
输出:
11111
1111
111
11
1
规律:内层循环的初始值是5-$row,第1行5-0=5次,第2行5-1=4次……第5行5-4=1次。
Pattern 7:倒三角形递减数字(每行从大数开始递减)
每行从某个数字开始向下递减,行号决定起始数字。
<?php
for ($row = 0; $row <= 5; $row++) {
for ($col = 5 - $row; $col >= 1; $col--) {
echo $col; // 输出列号(递减的)
}
echo "<br>";
}
?>
输出:
54321
4321
321
21
1
规律:第1行$col从5递减到1,输出54321;第2行从4递减到1,输出4321;以此类推。
Pattern 8:行号重复三角形(每行输出相同的行号)
每行输出同一个数字(即当前行号),重复次数等于行号。
<?php
for ($row = 5; $row >= 1; $row--) {
for ($col = $row; $col >= 1; $col--) {
echo $row . " "; // 输出行号,不是列号
}
echo "<br>";
}
?>
输出:
5 5 5 5 5
4 4 4 4
3 3 3
2 2
1
规律:外层循环从5递减到1,内层循环次数等于当前行号。每行输出相同的行号数字。
本节课程知识要点
| 知识点 | 说明 |
|---|---|
| 外层循环(行控制) | 控制总行数,$row变量代表当前行号 |
| 内层循环(列控制) | 控制每行的输出次数,次数与行号相关 |
| 连续计数器 | 跨行保持一个累加变量(如Pattern 1的$counter) |
| 奇偶交替模式 | 利用%取模判断索引的奇偶性 |
| 递减循环 | for($i=5;$i>=1;$i--)实现倒序 |
| 行号与列号区分 | echo $row输出行号,echo $col输出列号 |
Pattern 4 的说明
原示例中的Pattern 4代码有误:
for($i=0;$i>=5;$i++){ // 条件 $i>=5 不成立,循环不会执行
这个循环不会进入,因为初始$i=0,条件$i>=5为false。正确的Pattern 4通常是一个倒三角形,但原文没有提供正确版本,这里不展开。
八种图案的对比
| 图案 | 形状 | 数字内容 | 变化规律 |
|---|---|---|---|
| Pattern 1 | 正三角 | 连续递增 | 1,2,3,4…跨行连续 |
| Pattern 2 | 正三角 | 0和1交替 | 按列奇偶交替 |
| Pattern 3 | 正三角 | 1到行号 | 每行从1递增 |
| Pattern 5 | 正三角 | 全是1 | 固定数字 |
| Pattern 6 | 倒三角 | 全是1 | 固定数字 |
| Pattern 7 | 倒三角 | 递减数字 | 每行从大数递减到1 |
| Pattern 8 | 倒三角 | 重复行号 | 每行输出当前行号 |
常见错误与排查
错误1:循环边界差1(多一行或少一行)
-
例如:
$row<5和$row<=5的区别 -
解决:先用小数字(比如3行)测试,确认边界值
错误2:内层循环的初始值或条件写反
-
例如:正三角写成
$col <= $row,倒三角写成$col >= 1 -
解决:用具体数值代入验证
错误3:输出时忘记换行
-
后果:所有数字挤在一行
-
解决:内层循环结束后加
echo "<br>"或echo "\n"
个人经验与建议
第一,从最简单的图案开始。建议按顺序练习:Pattern 5(全1正三角)→ Pattern 6(全1倒三角)→ Pattern 3(123递增)→ Pattern 7(54321递减)→ Pattern 1(连续数)。Pattern 8和Pattern 2稍复杂,可以放在后面。
第二,理解行号和列号的角色。在$row和$col的双重循环中,$row决定“第几行”,$col决定“第几个”。输出$row还是输出$col,结果不同。这是区分不同图案的关键。
第三,自己动手修改参数。尝试把Pattern 3中的echo $col改成echo $row,看看输出变成什么样子。这种“微调后观察变化”的做法,对理解循环逻辑很有帮助。
第四,注意Pattern 1中的$counter位置。它在内层循环中累加,但定义在外层循环之前。如果把$counter=1放在外层循环内部,每行都会重置,结果就不一样了。这是一个容易忽略的细节。