For循环问题中的PHP字符迭代[重复]
Posted
技术标签:
【中文标题】For循环问题中的PHP字符迭代[重复]【英文标题】:PHP Character Iteration In For Loop Issue [duplicate] 【发布时间】:2013-01-05 16:52:57 【问题描述】:可能重复:Why doesn’t this code simply print letters A to 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 , 是的,
这似乎没问题。但是当我在上面的 for 循环中将 Y
替换为 Z
时,我得到了不寻常的结果
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, 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, HO, HP ,总部,HR,HS,HT,HU,HV,HW,HX,HY,HZ,IA,IB,IC,ID,IE,IF,IG,IH,II,IJ,IK,IL,IM,IN,IO , 知识产权, 智商, 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,英国,UL,UM,UN,UO,UP,UQ,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,YO,YP,YQ,YR,YS,YT,YU,YV,YW,YX,YY,YZ,
这种行为有什么原因吗?
【问题讨论】:
【参考方案1】:直接来自php Manual:
在处理字符变量而不是 C 的算术运算时,PHP 遵循 Perl 的约定。例如,在 PHP 和 Perl 中 $a = 'Z'; $a++;将 $a 变成 'AA',而在 C a = 'Z';一个++;将 a 转换为 '['('Z' 的 ASCII 值为 90,'[' 的 ASCII 值为 91)。请注意,字符变量可以递增但不能递减,即使如此,也仅支持纯 ASCII 字符(a-z 和 A-Z)。其他字符变量自增/自减无效,原字符串不变。
它继续运行的原因是因为您正在尝试进行数值比较(<=
和 AA < Z
、ZA == Z
(在执行 <=
时))而不是文字值比较(==
)。
鉴于此,您可以使用以下代码:
for ($c = "A"; $c != "Z"; $c++)
echo $c . ", ";
.. 或使用字符的实际序数值(我认为这是更好的解决方案):
for ($c = ord("A"); $c <= ord("Z"); $c++)
echo chr($c) . ", ";
【讨论】:
很好的解决方案,但它没有回答问题。【参考方案2】:递增字符时不要使用 (或 >= 或
for ($c = "A"; $c !== "AA"; $c++)
echo $c.", ";
'AA' 比你想要的端点“高一个”
$lastCharacter = 'Z';
$lastCharacter++;
for ($c = "A"; $c !== $lastCharacter; $c++)
echo $c.", ";
在到达 ZA 之前,所有由 ASCII 字符组成的单词(范围 A-Z)都将是 previous version of this question的回答
【讨论】:
这也是众多解决方案之一,但仍然无法回答为什么会这样?【参考方案3】:恭喜,您发现了 PHP 中的众多不一致之处之一。简而言之:+ 和
增加单字母字符串的效果如您所愿 增加Z
导致AA
等等(想想Excel 列)
比较单字母字符串的效果如您所愿
按字典顺序比较多字母字符串(逐个字母)
现在有趣的边缘情况是:
'Z' <= 'Z' // because equal
'Z'++ == 'AA' // because magic
'AA' <= 'Z' // because A comes before Z
【讨论】:
这是我在检查ord
输出时发现的。以上是关于For循环问题中的PHP字符迭代[重复]的主要内容,如果未能解决你的问题,请参考以下文章