为什么在字母自动递增后这种for循环比较失败

时间:2014-09-05 14:43:34

标签: php for-loop comparison

我刚给出了这个答案:https://stackoverflow.com/a/25688064/2627459以循环字母组合,使用以下代码:

for ($letter = 'a'; ; ++$letter) {
  echo $letter . '<br>';
  if ($letter == 'zz') break;
}

哪个工作正常。

然后我尝试将break移到for循环比较中,觉得它会更好:

for ($letter = 'a'; $letter < 'zz'; ++$letter) {
  echo $letter . '<br>';
}

但是,当然,最后一个值(zz)没有显示,所以我尝试了:

for ($letter = 'a'; $letter < 'aaa'; ++$letter) {
  echo $letter . '<br>';
}

我不知道为什么,但它给了我以下输出:

a

所以我尝试了几个条目,(奇怪的)结果是:

条目:$letter < 'yz' - 输出:仅限y

条目:$letter < 'zzz' - 输出:最多zzy

当链条以z开头时,我不知道它为什么会起作用,但在任何其他情况下(字母)它都会失败。

Morover,在$letter < 'aaa'的情况下,它会显示a,但不会显示下一个a < 'aaa'。在最坏的情况下,我原本预计它会因{{1}}而失败,因此显示。但没有。

那么,这种行为来自哪里,我是否遗漏了PHP如何比较这些值?

(我不是在寻找解决方法,而是在寻找解释。顺便说一句,如果有任何解释附带工作代码,那就完美了!)

1 个答案:

答案 0 :(得分:4)

比较是按字母顺序排列的:

$letter < 'yz' 

当您到达y时,您再次递增并按字母顺序获取zz大于yz

如果您使用

    $letter != 'yz' 

为了进行比较,它会为您提供yy

所以

for ($letter = 'a'; $letter !== 'aaa'; ++$letter) {
    echo $letter . '<br>';
}

将从azaaab .... azba ....到zz

另见this answer及相关评论

修改

我个人喜欢增加端点,所以

$start = 'A';
$end = 'XFD';

$end++;
for ($char = $start; $char !== $end; ++$char) {
    echo $char, PHP_EOL;
}