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)。其他字符变量自增/自减无效,原字符串不变。

它继续运行的原因是因为您正在尝试进行数值比较(&lt;=AA &lt; ZZA == Z(在执行 &lt;= 时))而不是文字值比较(==)。

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

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字符迭代[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用R中的下一个函数跳过for循环中的迭代[重复]

流程控制之for循环

迭代器和for循环工作机制

python中的if循环怎么样?

javascript中的for循环创建大写字符串[重复]

基于查询结果集的PHP跳过for循环迭代