为什么这个代码不能简单地打印字母A到Z?

<?php for ($i = 'a'; $i <= 'z'; $i++) echo "$i\n"; 

这段代码给出了以下输出(换行符被空格replace):

abcdefghijklmnopqrstu vwxyz aa ab ac ad af af ah ah a a a al a a a ap ap a ar as as au av aw ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cx cy cz da db dc dd dd df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e ev ew ev ew ev ew ev ew ex …

从文档 :

在处理字符variables而不是C的算术运算时,PHP遵循Perl的惯例。

例如,在Perl中, 'Z'+1变成'AA' ,而在'Z'+1变成'['ord('Z') == 90ord('[') == 91 ) 。

请注意,字符variables可以递增但不递减,即使只有纯ASCII字符(az和AZ)被支持。

来自评论: –
还应该注意的是<=是词典对比,所以'z'+1 ≤ 'z' 。 (因为'z'+1 = 'aa' ≤ 'z' 。但是'za' ≤ 'z'是第一次比较是错误的)。例如,当$i == 'z'会被破坏。

这里的例子 。

因为一旦达到了“z”(这是在你的范围内的有效结果,$ i ++按顺序递增到下一个值),下一个值将是'aa'; 并且按字母顺序,“aa”是“z”,所以比较永远不会被满足

 for ($i = 'a'; $i != 'aa'; $i++) echo "$i\n"; 

其他答案解释了发布代码的观察行为。 这里有一种方法可以做你想做的事情(而且是更简洁的代码,IMO):

 foreach (range('a', 'z') as $i) echo "$i\n"; 

回应ShreevatsaR关于范围函数的评论/问题:是的,它产生了“正确的端点”,即传递给函数的值在范围内。 为了说明,上述代码的输出是:

 a b c d e f g h i j k l m n o p q r s t u v w x y z 

其他人已经说过为什么PHP不显示你的期望。 以下是你如何得到你可能想要的结果:

 <?php for ($i = ord('a'); $i <= ord('z'); $i++) echo chr($i); ?> 

为什么不使用range('a','z')

试试这个代码。 我认为这个代码会对你有所帮助。

 $alphas = range('A', 'Z'); foreach($alphas as $value){ echo $value."<br>"; } 

依次显示26个字母。

 <?php $i = 'a'; do { echo ($j=$i++),"\r\n"; } while (ord($j) < ord($i)); ?> 

这也可以使用:

 for ($i = 'a'; $i <= 'z'; $i=chr(ord($i)+1)) echo "$i\n"; 

PHP具有循环字母的function,可以超越单个字符; 剩下的就是这样做的:a a ab ac … zz,等等。

尝试这个:

 <?php for ($i = 'a'; $i !== 'aa'; $i++) echo "$i\n"; ?> 

虽然上面的回答对于发生的事情是非常有洞见的,而且非常有趣(我不知道它会如此行事,而且很明白为什么。

最简单的修复(尽pipe可能不是最有意义的)只是将条件改为$ i!='z'

 <?php for ($i = 'a'; $i != 'z'; $i++) echo "$i\n"; ?> 

PHP不认为'AA'小于'Z'。 最好的方法是:

 for($i = 'a'; $i != 'aa'; $i++) { echo $i; } 

ABCDEFGHIJKLMNOPQRSTUVWXYZ

也许这个代码将起作用。 这很容易,可以理解:

 <?php $ascii_val = ord("a"); for($i=$ascii_val;$i<$ascii_val+26;$i++){ echo chr($i)."\n"; } ?> 

其中26是字母表中的字母总数。

哇,我真的不知道这个,但它不是一个大的代码,你可以尝试echo“z”后循环马克是绝对正确我用他的方法,但如果你想替代,那么也可以尝试

 <?php for ($i = "a"; $i = "y"; $i++) { echo "$i\n"; if ($i == "z") {} } echo "z"; ?>