← PHP中闰年判定的两种方法:日期函数与条件运算 PHP中五种字母三角形图案的详细拆解(使用range()函数) →

PHP中字母三角形(倒金字塔)的三种输出方法

原创 2026-05-21 PHP 已有人查阅

什么是字母三角形

字母三角形(Alphabet )是一种常见的编程练习题,指的是用字母排列成三角形或金字塔形状的输出。这里展示的是倒三角形式——每行输出相同的字母,从上到下每行的字母数量递减,且字母按字母表顺序逐行更换(A、B、C、D、E……)。

输出效果示例:

AAAAA
BBBB
CCC
DD
E

这种练习题的主要价值在于练习嵌套循环(Nested Loop)的使用,理解内外层循环的协作关系。

核心实现逻辑

无论是哪种方法,底层的逻辑结构是一致的:

外层循环:控制行数(从第1行到第5行),同时决定当前行应该输出哪个字母。

内层循环:控制当前行输出的字母个数(从5个递减到1个)。

输出规律:第1行输出5个A,第2行输出4个B,第3行输出3个C,第4行输出2个D,第5行输出1个E。

个人经验:初学者写这种金字塔图案时,经常把内外层循环的边界条件搞混。我的建议是先在纸上画出想要的输出效果,标出每行的行号和字符数量,再对照着写循环条件。这样不容易出错。

示例一:使用range()生成数组 + for循环

代码号学习编程中,range()函数可以快速生成一个包含A到Z的数组。

<?php  
$alphabetArray = range('A', 'Z');   // 生成 ['A','B','C',...,'Z']

// 外层循环:控制行数,只取前5个字母
for ($row = 0; $row < 5; $row++) {   
    // 内层循环:控制每行输出的字母个数,从5递减到1
    for ($col = 5; $col > $row; $col--) {  
        echo $alphabetArray[$row];   // 每行都输出同一个字母
    }  
    echo "<br>";   // 换行
}  
?>

代码拆解

  • range('A', 'Z') 返回一个数组,下标0对应'A',下标1对应'B'……下标4对应'E'

  • 外层循环$row从0到4,对应字母A到E

  • 内层循环$col从5递减到$row+1,次数分别为5、4、3、2、1

示例二:使用chr()函数 + ASCII码

chr()函数根据ASCII码值返回对应的字符。大写字母A到Z的ASCII码是65到90。

<?php  
// ASCII码65对应'A',66对应'B'……69对应'E'
for ($ascii = 65; $ascii <= 69; $ascii++) {   
    // 每行输出的个数:第1行5个,第2行4个……
    // 计算方式:5 - (ascii - 65) 即 5 - 行号
    for ($count = 5; $count >= $ascii - 64; $count--) {  
        echo chr($ascii);  
    }  
    echo "<br>";  
}  
?>

关于ASCII对照:65→A,66→B,67→C,68→D,69→E。内层循环的条件$count >= $ascii - 64,当$ascii=65时条件是>=1,输出5次;当$ascii=69时条件是>=5,输出1次。

这里有个小技巧:chr($ascii)比直接写字母更灵活,适合需要动态生成字符的场景。比如想输出大写字母到Z,只需要把循环上限改成90即可。

示例三:使用range() + foreach循环

这种方法把数组遍历和循环计数结合起来。

<?php  
$rowIndex = 1;   // 记录当前是第几行,用于控制输出个数
foreach (range('A', 'E') as $letter) {   // 只取前5个字母
    // 每行输出 6 - $rowIndex 个字母
    for ($col = 5; $col >= $rowIndex; $col--) {  
        echo $letter;  
    }  
    echo "<br>";  
    $rowIndex++;   // 行号递增
}  
?>

输出

AAAAA
BBBB
CCC
DD
E

本节课程知识要点

知识点 说明
range()函数 生成一个包含指定范围元素的数组,支持字母和数字
chr()函数 将ASCII码转换为对应的字符
ASCII码 大写字母A-Z对应65-90,小写a-z对应97-122
嵌套循环(Nested Loop) 外层循环控制行数,内层循环控制每行的输出个数
循环边界计算 根据行号计算每行需要输出的字符数量

三种方法的对比

维度 range() + for chr() + for range() + foreach
字母来源 range()生成数组 ASCII码动态转换 range()生成数组
循环结构 双重for 双重for foreach内嵌for
代码可读性 较高 中等(需要了解ASCII) 较高
灵活性 可轻松扩展到Z 可轻松扩展到任意ASCII范围 用foreach遍历更直观
适用场景 字母序列已知 需要动态计算字符 偏好foreach写法

个人经验:三种写法中,range() + for对我来说最直观,因为range(’A‘, ’E‘)直接表达意图。chr()方法适合需要根据数字动态生成字符的场景,比如验证码生成、字符转换等。foreach方法代码更现在,但从性能角度看,三种写法差别不大,选自己习惯的就行。

扩展练习:输出正三角形

上面三种例子输出的是倒三角形。稍微修改内层循环的边界,可以输出正三角形(金字塔形状)。

// 正三角形:第1行1个A,第2行2个B……
<?php  
$letters = range('A', 'E');  
for ($row = 0; $row < 5; $row++) {   
    for ($col = 0; $col <= $row; $col++) {   // 条件改为 <= $row
        echo $letters[$row];  
    }  
    echo "<br>";  
}  
?>

输出

A
BB
CCC
DDDD
EEEEE

常见错误与排查

错误1:内层循环条件写反,导致输出数量不对

  • 例如:用$col < 5而不是递减条件

  • 解决:画出行数与输出个数的对应关系,确认递减逻辑

错误2:chr()的参数用错

  • 小写字母a的ASCII是97,不是65

  • 大小写敏感,注意区分

错误3:range()函数参数顺序写反

  • range('Z', 'A') 返回空数组

  • 正确顺序是从小到大

错误4:换行位置放错

  • 内层循环结束后才换行,不能放在内层循环内部

  • 否则每个字母后面都换行,形成一列而不是一行

个人经验与建议

关于字母三角形这类图案练习题,我几点看法:

第一,这些练习的真正价值在于理解嵌套循环的协作关系。外层循环控制“第几行”,内层循环控制“每行多少个”。这个模式在后面处理表格数据、矩阵运算时都会用到。

第二,边界值计算是重点也是难点。很多初学者对$j=5; $j>$i; $j--这种条件感到困惑。我的建议是代入具体数值手动演算。比如$i=0时,$j从5到1共5次;$i=1时,从5到2共4次……算清楚再写代码。

第三,输出调试是一个实用技巧。如果循环结果不如预期,可以在循环内用echo "i=$i, j=$j<br>"输出变量值,观察循环执行过程。这个方法能帮很快定位边界问题。

第四,字母图案练习完成后,可以尝试数字图案。比如输出:

11111
2222
333
44
5

逻辑相同,只是把字母换成数字。这种变体能检验是否真正理解了循环逻辑。

← PHP中闰年判定的两种方法:日期函数与条件运算 PHP中五种字母三角形图案的详细拆解(使用range()函数) →
分享笔记 (共有 篇笔记)
验证码:
微信公众号