<?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"; ?>