439 Stimmen

Warum druckt dieser Code nicht einfach die Buchstaben A bis Z?

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

Dieses Snippet ergibt die folgende Ausgabe (Zeilenumbrüche werden durch Leerzeichen ersetzt):

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. .. on to yz

342voto

Christian C. Salvadó Punkte 763569

Von der docs :

PHP folgt der Konvention von Perl, wenn es um arithmetische Operationen auf Zeichenvariablen geht und nicht der von C.

Zum Beispiel, in Perl 'Z'+1 wird zu 'AA' , während in C 'Z'+1 wird zu '[' ( ord('Z') == 90 , ord('[') == 91 ).

Beachten Sie, dass Zeichenvariablen zwar inkrementiert, aber nicht dekrementiert werden können, und auch dann werden nur einfache ASCII-Zeichen (a-z und A-Z) unterstützt.

Aus den Kommentaren:-
Es ist auch zu beachten, dass <= ist ein lexikographischer Vergleich, also 'z'+1 'z' . (Da 'z'+1 = 'aa' 'z' . Aber 'za' 'z' ist das erste Mal, dass der Vergleich falsch ist.) Brechen, wenn $i == 'z' würde zum Beispiel funktionieren.

Beispiel hier .

124voto

Mark Baker Punkte 204969

Denn sobald 'z' erreicht ist (und das ist ein gültiges Ergebnis innerhalb Ihres Bereichs, $i++ erhöht es auf den nächsten Wert in der Reihenfolge), wird der nächste Wert 'aa' sein; und alphabetisch gesehen ist 'aa' < 'z', so dass der Vergleich nie erfüllt ist

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

97voto

GreenMatt Punkte 17578

Andere Antworten erklären das beobachtete Verhalten des veröffentlichten Codes. Hier ist ein Weg zu tun, was Sie wollen (und es ist sauberer Code, IMO):

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

Als Antwort auf den Kommentar/die Frage von ShreevatsaR zum Bereich Funktion: Ja, sie erzeugt den "richtigen Endpunkt", d. h. die an die Funktion übergebenen Werte liegen im Bereich. Zur Veranschaulichung: Die Ausgabe des obigen Codes war:

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 Punkte 35716

Andere haben bereits gesagt, warum PHP nicht das anzeigt, was Sie erwarten. Hier ist, wie Sie das gewünschte Ergebnis erhalten:

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

22voto

bcosca Punkte 17013

Warum verwenden Sie nicht einfach range('a','z') ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X