437 votes

Pourquoi ce code n'imprime-t-il pas simplement les lettres de A à Z ?

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

Cet extrait donne le résultat suivant (les nouvelles lignes sont remplacées par des espaces) :

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 aa ab ac ad ae af ag ah ai aj ak al am an 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 de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex. ... sur à yz

342voto

CMS Points 315406

De la docs :

PHP suit la convention de Perl lorsqu'il s'agit d'opérations arithmétiques sur des variables de type caractère et non celle du C.

Par exemple, en Perl, 'Z'+1 se transforme en 'AA', alors qu'en C, 'Z'+1 se transforme en '[' ( ord('Z') == 90, ord('[') == 91 ).

Notez que les variables de caractères peuvent être incrémentées mais pas décrémentées et même ainsi, seuls les caractères ASCII simples (a-z et A-Z) sont supportés.

Des commentaires:-
Il faut également noter que "<=" est une comparaison lexicographique, donc 'z'+1 ≤ 'z' . (Depuis 'z'+1='aa'≤'z' . Mais 'za'≤'z' est la première fois que la comparaison est fausse). Rupture lorsque $i=='z' fonctionnerait, par exemple.

Exemple ici .

123voto

Mark Baker Points 90240

Parce qu'une fois que 'z' est atteint (et c'est un résultat valide dans votre plage, le $i++ l'incrémente à la valeur suivante dans la séquence), la valeur suivante sera 'aa' ; et alphabétiquement, 'aa' est < 'z', donc la comparaison n'est jamais rencontrée

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

97voto

GreenMatt Points 6301

D'autres réponses expliquent le comportement observé du code affiché. Voici une façon de faire ce que vous voulez (et c'est un code plus propre, IMO) :

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

En réponse à la question/commentaire de ShreevatsaR au sujet de la gamme fonction : Oui, elle produit le "bon point final", c'est-à-dire que les valeurs passées à la fonction sont dans la plage. Pour illustrer, la sortie que j'ai obtenue était :

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

35voto

Filip Ekberg Points 22189

D'autres ont déjà expliqué pourquoi PHP n'affiche pas ce que vous attendez, voici comment obtenir le résultat que vous souhaitez.

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

22voto

stillstanding Points 10346

Pourquoi ne pas simplement utiliser range('a','z') ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X