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

16 Comments

  1. neolkb
    neolkb 2012-05-27

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

  2. pangyongtao
    pangyongtao 2010-12-30

    mark,以作警示

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

  4. 雪候鸟
    雪候鸟 2010-08-04

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

  5. luk4u
    luk4u 2010-08-03

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

  6. 江湖游医
    江湖游医 2010-08-03

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

  7. 雪候鸟
    雪候鸟 2010-07-31

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

  8. 胖子
    胖子 2010-07-31

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

Leave a Reply

Your email address will not be published. Required fields are marked *