在循环问题的PHP字符迭代

可能重复:
为什么这个代码不能简单地打印字母A到Z?

为什么当我使用下面的循环结构时,我得到了正确的结果 –

for ($c = "A"; $c <= "Y"; $c++) { echo $c.", "; } 

我得到的结果是 –

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,

这似乎是好的。 但是当我在上面的循环中用ZreplaceY ,我得到了不寻常的结果

 for ($c = "A"; $c <= "Z"; $c++) { echo $c.", "; } 

我得到的结果是 –

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, AY,AZ,BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT, BX,BY,BZ,CA,CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CM,CN,CO,CP,CQ,CR,CS,CT, 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,E​​L,EM,EN,EO,EP,EQ,ER,ES,ET, EU,EW,EX,EY,EZ,FA,FB,FC,FD,FE,FF,FG,FH,FI,FJ,FK,FL,FM,FN,FO,FP,FQ,FR,FS, FT,FU,FV,FW,FX,FY,FZ,GA,GB,GC,GD,GE,GF,GG,GH,GI,GJ,GK,GL,GM,GN,GO,GP,GQ,GR, GS,GT,GU,GV,GW,GX,GY,GZ,HA,HB,HC,HD,HE,HF,HG,HH,HI,HJ,HK,HL,HM,HN, HR,HS,HT,HU,HV,HW,HX,HY,HZ,IA,IB,IC,ID,IE,IF,IG,IH,II,IJ,IK,IL, IQ,IR,IS,IT,IU,IV,IW IX,IY,IZ,JA,JB,JC,JD,JE,JF,JG,JH,JI,JJ,JK,JL,JM,JN,JO,JP,JQ,JR,JS,JT,JU, ,JW,JX,JY,JZ,KA,KB,KC,KD,KE,KF,KG,KH,KI,KJ,KK,KL,KM,KN,KO,KP,KQ,KR,KS,KT,KU ,KV,KW,KX,KY,KZ,LA,LB,LC,LD,LE,LF,LG,LH,LI,LJ,LK,LL,LM,LN,LO,LP,LQ,LR,LS, ,LU,LV,LW,LX,LY,LZ,MA,MB,MC,MD,ME,MF,MG,MH,MI,MJ,MK,ML,MM,MN, MT,MU,MV,MW,MX,MY,MZ,NA,NB,NC,ND,NE,NF,NG,NH,NI,NJ,NK,NL,NM,NN, NS,NT,NU,NV,NW,NX,NY,NZ,OA,OB,OC,OD,OE,OF,OG,OH,OI,OJ,OK,OL,OM,ON,OO,OP, OR,OS,OT,OU,OV,OW,OX,OY,OZ,PA,PB,PC,PD,PE,PF,PG,PH,PI,PJ,PK,PL,PM,PN,PO,PP ,PQ,PR,PS,PT,PU,PV,PW,PX,PY,PZ,QA,QB,QC,QD,QE,QF,QG,QH,QI,QJ,QK,QL,QM,QN, ,QP,QQ,QR,QS,QT,QU,QV,QW,QX,QY,QZ,RA,RB,RC,RD,RE,RF,RG,RH,RI,RJ,RK,RL,RM, ,RO,RP,RQ,RR,RS,RT,RU,RV,RW,RX,RY,RZ,SA,SB,SC,SD,SE,SF,SG,SH,SI,SJ,SK,SL,SM ,SN,SO,SP,SQ,SR,SS,ST,SU,SV,SW,SX,SY,SZ,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ, TM,TN,TO,TP,TQ,TR,TS,TT,TU,TV,TW,TX,TY,TZ,UA,UB,UC,UD,UE,UF,UG,UH,UI,UJ, UL,UM,UN,UO,UP,UQ,UR,US,UT,UU,UV,UW,UX,UY,UZ,VA,VB,VC,VD,VE,VF,VG,VH,VI, ,VK,VL,VM,VN,VO,VP,VQ,VR,VS,VT,VU,VV,VW,VX,VY,VZ,WA,WB,WC,WD,WE,WF,WG,WH, ,WJ,WK,WL,WM,WN,WO,WP,WQ,WR,WS,WT,WU,WV,WW,WX,WY,WZ,XA,XB,XC,XD,XE,XF,XG,XH ,X1,XJ,XK,XL,XM,XN,XO,XP,XQ,XR,XS,XT,XU,XV,XW,XX,XY,XZ,YA,YB,YC,YD,YE,YF,YG ,YH,YI,YJ,YK,YL,YM,YN,YO,YP,YQ,YR,YS,YT,YU,YV,YW,YX,YY,

这种行为的任何理由?

直接从PHP手册 :

在处理字符variables而不是C的算术运算时,PHP遵循Perl的惯例。 例如,在PHP和Perl $ a ='Z'; $ A ++; 将$ a变成'AA',而C a ='Z'; 一个++; 将a变成'['('Z'的ASCII值是90,'['的ASCII值是91)。 请注意,字符variables可以递增但不递减,即使只有纯ASCII字符(az和AZ)被支持。 递增/递减其他字符variables不起作用,原始string不变。

它继续前进的原因是因为你正在尝试数值比较( <=AA < ZZA == Z (当<= ))而不是文字值比较( == )。

鉴于此,您可以使用以下代码:

 for ($c = "A"; $c != "Z"; $c++) { echo $c . ", "; } 

..或使用字符的实际序数值(在我看来这是更好的解决scheme):

 for ($c = ord("A"); $c <= ord("Z"); $c++) { echo chr($c) . ", "; } 

增加字符时不要使用<或>(或> =或<=)进行比较,请使用!==

 for ($c = "A"; $c !== "AA"; $c++) { echo $c.", "; } 

“AA”比你想要的端点“高一个”

 $lastCharacter = 'Z'; $lastCharacter++; for ($c = "A"; $c !== $lastCharacter; $c++) { echo $c.", "; } 

所有由ASCII字符组成的字(范围AZ)在ZA之前都是<='Z',因为compasrison是一个string比较,如果string被sorting,那么“AA”是<“Z”。 看到我对这个问题的以前版本的答案

恭喜,你发现了PHP中的许多不一致之处。 总之:+和<操作符在string上完全不同。

  • 增加一个单字母string就像你所期望的那样工作
  • AA增加Z结果等等(想想Excel列)
  • 比较单字母string的作品,你会发现
  • 比较多字母string按字典顺序(逐字母)

现在有趣的边缘情况是:

 'Z' <= 'Z' // because equal 'Z'++ == 'AA' // because magic 'AA' <= 'Z' // because A comes before Z