从A到Z
入门。
学习编程学到循环就开始有趣了,终于发现有些事情,程序比手工更有效率,比如打印出来 a 到 z 的 26 个字母。用 C/C++/Java 之类的 for 循环可以这么写:
for (char c = 'a'; c <= 'z'; c++) {
System.out.println(c);
}
放弃?
直到你听说“PHP 是最好的语言“...你又写了一个 for 循环:
php > for ($c = 'a'; $c <= 'z'; $c++) { print $c."\n"; }
结果不是 26 个字符,而是……676 个……
进阶!
同样的++
, 不同的是,Java 里z
的下一个是{
jshell> char c = 'z';
c ==> 'z'
jshell> c++
jshell> c
$3 ==> '{'
而 PHP 找到z
的下一个序列,是aa
……
php > $c = 'z';
php > $c++;
php > print $c;
aa
但比较字符串的时候,aa
要小于z
,所以循环并没有结束
php > $b = 'z';
php > $a = 'aa';
php > print strcmp($a, $b);
-25
循环直到za
才会结束,所以你看到的结果是这样的:
a
b
...
y
z
aa // loop continues because 'aa' <= 'z'
ab
...
mf
mg
...
yy
yz
za // loop now terminates because 'za' > 'z'
解决方案是用这样的循环:
foreach (range('a', 'z') as $c) {
// ...
}