Почему этот код не просто печатает буквы от A до Z?

<?php for ($i = 'a'; $i <= 'z'; $i++) echo "$i\n"; 

Этот фрагмент дает следующий результат (новые строки заменяются пробелами):

abcdefghijklmnopqrstu vwxyz aa ab ac ad ae af ag ah ai aj ak al am a ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e ex ex … on to yz

Из документов :

PHP следует за соглашением Perl при работе с арифметическими операциями над символьными переменными, а не с C.

Например, в Perl 'Z'+1 превращается в 'AA' , а в C 'Z'+1 превращается в '[' ( ord('Z') == 90 , ord('[') == 91 ) ,

Обратите внимание, что символьные переменные могут увеличиваться, но не уменьшаться, и поэтому поддерживаются только простые символы ASCII (az и AZ).

Из комментариев: –
Следует также отметить, что <= – лексикографическое сравнение, поэтому 'z'+1 ≤ 'z' . (Так как 'z'+1 = 'aa' ≤ 'z' . Но 'za' ≤ 'z' – это первый случай, когда сравнение ложно.) Ломается, когда $i == 'z' будет работать, например.

Пример здесь .

Поскольку достигается «z» (и это допустимый результат в вашем диапазоне, $ i ++ увеличивает его до следующего значения в последовательности), следующее значение будет «aa»; и в алфавитном порядке, 'aa' является <'z', поэтому сравнение никогда не выполняется

 for ($i = 'a'; $i != 'aa'; $i++) echo "$i\n"; 

Другие ответы объясняют наблюдаемое поведение опубликованного кода. Вот один из способов сделать то, что вы хотите (и это более чистый код, IMO):

 foreach (range('a', 'z') as $i) echo "$i\n"; 

В ответ на комментарий ShreevatsaR / вопрос о функции диапазона : Да, он создает «правую конечную точку», то есть значения, переданные функции, находятся в диапазоне. Чтобы проиллюстрировать, выход из вышеуказанного кода был:

 a b c d e f g h i j k l m n o p q r s t u v w x y z 

Другие уже сказали, почему PHP не показывает, чего вы ожидаете. Вот как вы получите результат, который вам может понадобиться:

 <?php for ($i = ord('a'); $i <= ord('z'); $i++) echo chr($i); ?> 

Почему бы просто не использовать range('a','z') ?

Попробуйте этот код. Я думаю, этот код будет вам полезен.

 $alphas = range('A', 'Z'); foreach($alphas as $value){ echo $value."<br>"; } 

Отображение 26 букв в последовательности.

 <?php $i = 'a'; do { echo ($j=$i++),"\r\n"; } while (ord($j) < ord($i)); ?> 

Также это можно использовать:

 for ($i = 'a'; $i <= 'z'; $i=chr(ord($i)+1)) echo "$i\n"; 

PHP имеет функцию циклических букв и может превышать одиночные символы; остальное будет сделано следующим образом: aa ab ac … zz и т. д.

Попробуй это:

 <?php for ($i = 'a'; $i !== 'aa'; $i++) echo "$i\n"; ?> 

Хотя вышеприведенные ответы проницательны в том, что происходит, и довольно интересные (я не знал, что это будет вести себя так, и это приятно понять, почему.

Самое простое исправить (хотя, возможно, и не самое значимое) было бы просто изменить условие на $ i! = 'Z'

 <?php for ($i = 'a'; $i != 'z'; $i++) echo "$i\n"; ?> 

PHP не рассматривает «AA» меньше, чем «Z». Лучший способ сделать это:

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

АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ

Возможно, этот код будет работать. Это легко и понятно:

 <?php $ascii_val = ord("a"); for($i=$ascii_val;$i<$ascii_val+26;$i++){ echo chr($i)."\n"; } ?> 

где 26 – общее количество букв в алфавите.

Ничего себе, я действительно не знал об этом, но его не большой код, который вы можете попробовать echo «z» после цикла Mark. Абсолютно правильно. Я использую его метод, но если вы хотите альтернативы, тогда вы также можете попробовать

 <?php for ($i = "a"; $i = "y"; $i++) { echo "$i\n"; if ($i == "z") {} } echo "z"; ?>