Почему этот код не просто печатает буквы от 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";
?>