PHP字符循环迭代问题


PHP Character Iteration In For Loop Issue

可能重复:
为什么这个代码不简单地打印字母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、

这似乎没问题。但当我在上面的循环中用Z替换Y时,我得到了不寻常的结果

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、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、EY、EZ、FA、FB、FC、FD、FE、FF、FG、FH、FI、FJ、FK、FL、FM、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,HO,HP,HQ,HR,HS,HT,HU,HV,HW,HX,HY,HZ,IA,IB,IC,ID,即,IF,IG,IH,II,IJ,IK,IL,IM,IN,IO,IP,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、JV、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、LT、LU、LV、LW、LX、LY、LZ、MA、MB、MC、MD、ME、MF、MG、MH、MI、MJ、MK、ML、MM、MN、MO、MP、MQ、MR、MS、MT、MU、MV、MW、MX、MY、MZ、NA、NB、NC、ND、NE、NF、NG、NH、NI、NJ NK,NL,NM,NN,NO,NP,NQ,NR,NS,NT,NU,NV,NW,NX,NY,NZ,OA,OB,OC,OD,OE,OF,OG,OH,OI,OJ,OK,OL,OM,ON,OO,OP,OQ,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,QO,QP,QQ,QR,QS,QT,QU,QV,QW,QX,QY,QZ,RA、RB、RC、RD、RE、RF、RG、RH、RI、RJ、RK、RL、RM、RN、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、TK、TL、TM、TN、TO、TP、TQ、TR、TS、TT、TU、TV、TW、TX、TY、TZ、UA、UB、UC、UD、UE、UF、UG、UH、UI、UJ、UK、UL、UM、UN、UO、UP、UK、UR、US、UT、UU、UV、UW、UX、UY、UZ、VA、VB、VC、VD,VE,VF,VG,VH,VI,VJ,VK,VL,VM,VN,VO,VP,VQ,VR,VS,VT,VU,VV,VW,VX,VY,VZ,WA,WB,WC,WD,WE,WF,WG,WH,WI、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、XI、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 Y、YO、YP、YQ、YR、YS、YT、YU、YV、YW、YX、YY、YZ、

这种行为有什么原因吗?

直接从PHP手册:

PHP在处理字符变量的算术运算时遵循Perl的约定,而不是C。例如,在PHP和Perl中$a='Z'$a++;将$a转换为"AA",而在C中,a="Z";a++;将a转换为"["(ASCII值"Z"为90,ASCII值"["为91(。请注意,字符变量可以递增,但不能递减,即使如此,也只支持普通ASCII字符(a-Z和a-Z(。递增/递减其他字符变量无效,原始字符串不变。

它之所以持续下去,是因为您正在尝试数值比较(<=AA < ZZA == Z(在执行<=时((,而不是文字值比较(==(。

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

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

或者使用字符的实际序数(在我看来这是更好的解决方案(:

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字符组成的所有单词(范围A-Z(都将是<='Z',直到你到达ZA,因为compasrison是一个字符串比较,而"AA"是<如果字符串已排序,则为"Z"。请参阅我对这个问题以前版本的回答

恭喜您,您发现了PHP中许多不一致的地方之一。简而言之:+和<运算符在字符串上的工作方式完全不同。

  • 增加单个字母字符串的效果正如您所期望的那样
  • 增加Z会导致AA,依此类推(想想Excel列(
  • 比较单个字母字符串的效果正如您所期望的那样
  • 比较多个字母字符串按字典顺序排列(逐个字母(

现在有趣的边缘案例是:

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