版本一:
- for($i=ord('a'); $i<ord('z'); $i++) {
- echo chr($i);
- }
版本二(與第一版類似使用ascii):
- for($i=0; $i<26; $i++) {
- echo chr($i+97);
- }
版本三:echo implode('', range('a', 'z'));
版本四(高智商坑爹版):
- for($i='a'; $i!='aa'; $i++) {
- echo $i;
- }
版本五:
- for($i='a'; strlen($i)<2; $i++) {
- echo $i;
- }
前兩個循環很容易理解,a到z每個字母的ascii碼值是遞增不變的,所以這兩個方法就是通過ascii值去做循環計算,用到了php內置的ord()和chr()函數.
第三個方法使用php內置的range()函數生成一個從a到z遞增的數組,步長為1,之后用implode函數將數組合并成字符串.
后兩個方法就是本篇標題中所要講的”奇怪現象”.
從理論上來講,咱們用for($i=’a'; $i<'z';$i++)的寫法也很正確,合情合理,但現實是殘酷的,試一下就會發現得到的并不是想要結果,前面a到z是出來了,后面又輸出一長串字符.
如果在for循環中每次輸出一個換行再觀察的話就會發現一個規則,a-z,下一次輸出了aa、ab、ac...az,然后是ba、bb、bc...bz....也就是php在給z加一后自動“進位”了,php一個奇特的26進制,當"當前位"的z加1后會向它前面的一位上增加1,然后當前位變為a,'z'++ => ‘aa’,’az’=>’ba’,’zz’=>’aaa’….
注意的兩點:1.這種規律不能用于判斷,如’z'<‘aa’是false。php中字符串比較時只會由左至右依次比較,2.目前只發現在”前自加”或”前自減”時會出現此種規律,參與其它算術運算時php將純字符串強轉為0.
新聞熱點
疑難解答