为什么在字母上自动递增后,循环比较失败


Why does this for-loop comparison fail after auto-incrementing on letters

我刚刚给出了这个答案: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开始时它会工作,但在任何其他情况下都会失败(字母)。

此外,在$letter < 'aaa'的情况下,它显示a,但不显示下一个。在最坏的情况下,我本以为a < 'aaa'会失败,因此显示什么都不显示。但是没有。

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

(我不是在寻找一个变通方法,而是一个解释。顺便说一句,如果有任何解释伴随着一个工作代码,那就太完美了!)

比较按字母顺序排列:

$letter < 'yz' 

当你到达y时,你再次递增,得到z。。。。。按字母顺序,z大于yz

如果您使用

    $letter != 'yz' 

相反,对于您的比较,它将为您提供yy

所以

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

将从a开始,通过zaaab。。。。azba。。。。直到CCD_ 23。

另请参阅此答案和相关评论

编辑

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

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