PHP回显字符变量错误。

3
我有这段代码
<?php
for($i="a";$i<="z";$i++)    {
echo $i;
}
?>

我有一个问题,如果
$i <="y"

这仍然是正确的并且会输出

a->y

但是如果像上面这样写$i<="z",结果将会是:

abcdefghijklmnopqrstuvwxyz aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayaz babbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybz cacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycz dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydz eaebecedeeefegeheiejekelemeneoepeqereseteuevewexeyez fafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfz gagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygz hahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhz iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiz jajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjz kakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykz lalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylz mambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymz nanbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynz oaobocodoeofogohoiojokolomonooopoqorosotouovowoxoyoz papbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypz qaqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqz rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrz sasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszt atbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytz uaubucudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuz vavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvz wawbwcwdwewfwgwhwiwjwkwlwmwnwowpwqwrwswtwuwvwwwxwywz xabxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxyxz yaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyz

这是一段包含所有字母的文本,用于测试编码和解码算法。

我不知道为什么,有人能帮帮我吗?


哇,这就像是 Excel 中的 A-Z,然后是 AA-AZ... - Bakudan
1
$i是一个字符串,而$i++可能是将它们拼接在一起。 - acutesoftware
你实际上想要它打印出什么?字母表吗? - Till Helge
@TillHelgeHelwig 你懂的,老铁 :D - Duc Anh
可能是字符串的增量行为 - PHP彩蛋?的重复问题。 - Jasper
@DucAnh 最简单的方法是 echo 'abcdefghijklmnopqrstuvwxyz';。但除此之外...你不能像使用数字那样使用字符。它不起作用。 - Till Helge
6个回答

6

查看PHP文档关于字符自增的解释:

PHP在处理字符变量的算术运算时,遵循Perl的约定而不是C的。例如,在PHP和Perl中 $a = 'Z'; $a++; 将$a变为'AA',而在C中 a = 'Z'; a++; 将a变为 '[' ('Z' 的ASCII值为90,'[' 的ASCII值为91)。请注意,只有纯ASCII字符(a-z和A-Z)可以自增,而字符变量不能自减。即使这样做,也只支持纯ASCII字符,其他字符变量的自增/自减不会产生任何效果,原始字符串保持不变。


谢谢!所以如果 $i="z",那么 $i++ 将会得到 $i="aa" 的结果,对吗? 而且 "z" < "aa",这似乎有点奇怪?@@ - Duc Anh
可以尝试使用break来中止循环,例如当$i =='z'时。 - Alvaro
@DucAnh,“z” < “aa”的比较是词汇比较,就像“bar” < “car” < “case”一样。这并不奇怪,只是不是你期望的比较方式。 - tmuguet
是的,这并不奇怪。这在逻辑上是正确的。 - Alvaro

3

0

我不知道为什么会发生这种情况,或者你为什么要这样做。但是如果你只想要一个包含所有小写字母 a-z 的数组(?),可以尝试以下代码:

$myArray = range('a', 'z');


0

"aa" <= "z" 返回 true,因为这是词法比较(不是您期望的比较),所以您的循环会一直持续到 "za"

如其他答案中所提到的,使用 range('a', 'z')for($i="a"; $i != "aa"; $i++)


0
在for循环中,从第二次开始增量先起作用,然后再检查条件,所以当$i="Z"时,在($i<="z")之后进行检查,此时当它增加其值时,$i变成"z"到"aa",这仍然小于"z",因此循环将继续直到"yz"。

0

你也可以试试这个:

for($i="a"; $i != "aa"; $i++)
{
  echo $i;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接