Press "Enter" to skip to content

注意PHP对字符串的递增运算

有同学问了一个问题:

<?php
for($i = 'A'; $i <= 'Z'; $i++) {
    echo $i;
}

输出是啥?
输出是:

ABCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARAS.......

为啥?
其实很简单, PHP的手册中也有说明, 只不过恐怕很多人不会一章一节的把手册仔细阅读一遍:

PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in Perl 'Z'+1 turns into 'AA', while in C 'Z'+1 turns into '[' ( ord('Z') == 90, ord('[') == 91 ). Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.

在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 Perl 中 'Z'+1 将得到 'AA',而在 C 中,'Z'+1 将得到 '['(ord('Z') == 90,ord('[') == 91)。注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。
也就是说, 如果:

$name = "laruence";
++$name; //将会是"laruencf"

而:

$name = "laruence";
--$name; //没有影响, 还是"laruence"

所以, 这个问题的原因就是当$i = Z的时候, ++$i成了AA, 而字符串比较的话,
AA,BB,XX一直到YZ都是小于等于Z的... so..
最后, 说个题外话: Blog现在支持订阅评论了, 同学们有提问以后等我回答的, 可以在留言提问的时候, 选择:Notify me of followup comments via e-mail

19 Comments

  1. 喜欢悠闲独自在
    喜欢悠闲独自在 September 12, 2019

    受教了

  2. qfx
    qfx June 29, 2019

    运行了一下 电脑卡了 cry

  3. neolkb
    neolkb May 27, 2012

    其实这是很有用的,我在用phpexcel导出报表的时候,使用的就是这个
    在for循环中使用1个数字变量来控制字符变量的循环次数,就可以很轻松的控制好excel表格列
    :
    $array为数据库查询出来的数据
    for($i=’A’,$j=’0′;$j<count($array);$j++,$i++){
    echo $i;
    }

  4. Jquery学习
    Jquery学习 January 6, 2011

    额~~从来没有考虑过这个问题~~

  5. pangyongtao
    pangyongtao December 30, 2010

    mark,以作警示

  6. […] = 'A'; $i 输出竟然是'AA'。。。这确实让人意外,最后在laruence的博客中找到了解释,原来当$i = […]

  7. 雪候鸟
    雪候鸟 August 4, 2010

    @luk4u 你好, 指点不敢, 有问题可以互相交流, 🙂

  8. luk4u
    luk4u August 3, 2010

    博主,您好,关注你的博客有一段时间了,感觉非常会钻研。我也有看php的c代码,memcached,nginx代码都有看过。我的博客http://hi.baidu.com/luk4u,希望多多指点我 ^^

  9. 江湖游医
    江湖游医 August 3, 2010

    大师就是大师啊.
    看来很平常的问题,经过一分析原来其中还有大道理..

  10. 雪候鸟
    雪候鸟 July 31, 2010

    @胖子 这个总结挺Cool:”PHP中没有字符”

  11. 胖子
    胖子 July 31, 2010

    其实说明了另一个问题:PHP中没有字符,即使用chr,返回的也是一个长度为1的字符串
    如:
    var_dump(chr(90));
    得到:
    string ‘Z’ (length=1)

  12. 胖子
    胖子 July 31, 2010

    学习了,感谢鸟哥

Comments are closed.