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


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

Cet extrait donne la sortie suivante (les retours à la ligne sont remplacés par des espaces):

abcdefghijklmnopqrstu vwxyz aa ab ac ad af a ah al aj ak al a an ap aq ar comme au av aw ax ay az ba bb bd être bf bg bh bi bj bk bl bm bn bo bp bq bn bt bo bv bw bx par bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cv cw cx cy cz da db dc dd df dg dh dj dk dl dm dn dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el e en e e e e er e e er e e e eu e e ex e ... sur yz


429
2017-11-04 15:36


origine


Réponses:


Du docs:

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

Par exemple, en Perl 'Z'+1 se transforme en 'AA', 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 que seuls les caractères ASCII (a-z et A-Z) sont pris en charge.

De Commentaires: -
Il convient également de 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.) $i == 'z' travaillerait, par exemple.

Exemple ici.


337
2017-11-04 15:42



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

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

119
2017-11-04 15:44



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 au commentaire / question de ShreevatsaR sur la gamme Fonction: Oui, elle produit le "point d'extrémité droit", c'est-à-dire que les valeurs transmises à la fonction sont dans la plage. Pour illustrer, le résultat du code ci-dessus é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

97
2017-11-04 15:45



D'autres ont déjà expliqué pourquoi PHP n'indique pas ce que vous attendez. Voici comment vous obtenez le résultat souhaité:

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

34
2017-11-04 15:42



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


21
2017-11-04 15:46



Essayez ce code. Je pense que ce code vous sera utile.

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

Afficher 26 lettres en séquence.


4
2018-05-11 10:12



<?php

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

?>

2
2017-07-28 21:52



Aussi cela peut être utilisé:

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

2
2018-05-06 00:59



PHP a pour fonction de boucler des lettres et peut dépasser les caractères uniques; le reste sera fait de cette façon: aa ab ac ... zz, et ainsi de suite.

Essaye ça:

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

2
2017-07-31 14:17



Alors que les réponses ci-dessus sont perspicaces à ce qui se passe, et assez intéressant (je ne savais pas qu'il se comporterait comme ça, et c'est bon de voir pourquoi.

La solution la plus simple (bien que peut-être pas la plus significative) serait juste de changer la condition à $ i! = 'Z'

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

0
2017-11-04 16:15



Le PHP ne considère pas «AA» moins que «Z». La meilleure façon de faire ceci est:

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

abcdefghijklmnopqrstuvwxyz


0
2018-03-22 13:23