Почему этот код не просто печатает буквы от 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 a ap 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 c c c c c c c c c c d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d 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 ev ew ex... on to yz
Ответы
Ответ 1
Из docs:
PHP следует за соглашением Perl при работе с арифметическими операциями над символьными переменными, а не с C.
Например, в Perl 'Z'+1
превращается в 'AA'
, а в C 'Z'+1
превращается в '['
(ord('Z') == 90
, ord('[') == 91
).
Обратите внимание, что символьные переменные могут увеличиваться, но не уменьшаться, и даже поэтому поддерживаются только простые символы ASCII (a-z и A-Z).
От комментариев: -
Следует также отметить, что <=
является лексикографическим сравнением, поэтому 'z'+1 ≤ 'z'
. (Так как 'z'+1 = 'aa' ≤ 'z'
. Но 'za' ≤ 'z'
- это первый случай, когда сравнение ложно.) Разрыв, если $i == 'z'
будет работать, например.
Пример здесь.
Ответ 2
Поскольку после достижения "z" (и это допустимый результат в вашем диапазоне, $i ++ увеличивает его до следующего значения в последовательности), следующее значение будет "aa"; и в алфавитном порядке, 'aa' 'z', поэтому сравнение никогда не выполняется
for ($i = 'a'; $i != 'aa'; $i++)
echo "$i\n";
Ответ 3
Другие ответы объясняют наблюдаемое поведение опубликованного кода. Вот один из способов сделать то, что вы хотите (и это более чистый код, IMO):
foreach (range('a', 'z') as $i)
echo "$i\n";
В ответ на комментарий/вопрос ShreevatsaR о функции range: Да, он создает "правую конечную точку", то есть пройденные значения к функции находятся в диапазоне. Чтобы проиллюстрировать, вывод из вышеуказанного кода был:
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
Ответ 4
Другие уже сказали, почему PHP не показывает, чего вы ожидаете. Вот как вы получите результат, который вам может понадобиться:
<?php
for ($i = ord('a'); $i <= ord('z'); $i++)
echo chr($i);
?>
Ответ 5
Почему бы просто не использовать range('a','z')
?
Ответ 6
Попробуйте этот код. Я думаю, этот код будет вам полезен.
$alphas = range('A', 'Z');
foreach($alphas as $value){
echo $value."<br>";
}
Отобразить 26 букв в последовательности.
Ответ 7
<?php
$i = 'a';
do {
echo ($j=$i++),"\r\n";
} while (ord($j) < ord($i));
?>
Ответ 8
PHP имеет функцию циклических букв и может превышать одиночные символы; остальное будет сделано следующим образом: aa ab ac... zz и т.д.
Попробуйте следующее:
<?php
for ($i = 'a'; $i !== 'aa'; $i++)
echo "$i\n";
?>
Ответ 9
Также это можно использовать:
for ($i = 'a'; $i <= 'z'; $i=chr(ord($i)+1))
echo "$i\n";
Ответ 10
В то время как вышеупомянутые ответы проницательны в том, что происходит, и довольно интересны (я не знал, что это будет вести себя так, и это хорошо, чтобы понять, почему.
Самое простое исправить (хотя, возможно, и не самое значимое) было бы просто изменить условие на $i!= 'z'
<?php
for ($i = 'a'; $i != 'z'; $i++)
echo "$i\n";
?>
Ответ 11
Возможно, этот код будет работать. Его легко понять и понять:
<?php
$ascii_val = ord("a");
for($i=$ascii_val;$i<$ascii_val+26;$i++){
echo chr($i)."\n";
}
?>
где 26 - общее количество букв в алфавите.
Ответ 12
PHP не считает "AA" меньше, чем "Z".
Лучший способ сделать это:
for($i = 'a'; $i != 'aa'; $i++) {
echo $i;
}
АБВГДЕЖЗИКЛМНОПРСТУФХЧШЭЮЯ
Ответ 13
Ничего себе, я действительно не знал об этом, но его не большой код, который вы можете попробовать echo "z" после цикла. Марк абсолютно прав. Я использую его метод, но если вам нужна альтернатива, тогда вы также можете попробовать
<?php
for ($i = "a"; $i = "y"; $i++) {
echo "$i\n";
if ($i == "z") {}
}
echo "z";
?>