我想你肯定不会手动写去世的是么?26个字母,毕竟也不多,很多同学都是手动敲上去的。
我们说一说随意马虎犯的一些小缺点,以加深循环对字符操作的印象。
先说一个同学在写循环打印 a-z 字母序列的时候,碰着的坑。他的代码是这么写的:

for ($i = 'a'; $i <= 'z'; $i++) echo "$i\n";
想着也比较大略,不至于出什么幺蛾子。可是,缺点还是一如既往地涌现了。打印的内容是这么一堆乱七八糟:
是不是完备不是我们要的样子。眼尖的同学立马意识到,for 循环的结束条件出问题了。没有在打印到字母 z 的时候即时终止。
到底为什么呢?文档里说的很清楚:
在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习气,而非 C 的。
在 Perl 中$a = 'Z'; $a++;将把$a变成'AA',而在 C 中,a = 'Z'; a++;将把a变成'['('Z'的 ASCII 值是 90,'['的 ASCII 值是 91)。
把稳字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变革。
这是 PHP 独特的字符串递增所产生的。我们实际测试一下:
var_dump('aa' <= 'z'); // truevar_dump('yz' <= 'z'); // truevar_dump('za' <= 'z'); // false
以是上述的代码一贯运行下去,字符串比较适中成功。为了精确地实行,代码须要改动一下:
for ($i = 'a'; $i != 'aa'; $i++) echo "$i\n";
在输出到字符串 'aa' 的时候立马跳出循环。这是基于上述精确理解后作出的改动。
精良的办理方案上述方法中利用 $i !== 'aa' 进行的操作实属无奈之举。当然是有更好的办法的,便是 PHP 内置的 range 函数,它可以天生一个序列值,容错性非常好:
foreach (range('a', 'z') as $i) echo "$i\n";
如果非要手动遍历,那就一定避免字符递加,而是利用整数递加,就能杜绝程序跑偏。比如利用 ord 函数,作为 ASCII 字符的边界值:
for ($i = ord('a'); $i <= ord('z'); $i++) echo chr($i);
写在末了Bug 虽小,却映射出编程措辞深层的事理,这样的知识,我甘心来一打。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。