делая очень простую проверку, я написал
$char = 'a';
while ( $char < "z" ) {
echo $char++ . ' ';
}
и, как и ожидалось, результат был 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
, Затем я изменил условие на <=
лайк
$char = 'a';
while ( $char <= "z" ) {
echo $char++ . ' ';
}
Я ожидал 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
Но реальный результат был
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 hq hr hs ht hu hv hw hx hy hz ia ib ic id ie 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 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
так почему именно результат оказался не таким, как я ожидал? я использую PHP 7.0.8
Это немного знакомая особенность PHP.
PHP следует соглашению Perl при работе с арифметическими операциями над символьными переменными, а не с Си. Например, в PHP и Perl $ a = ‘Z’; $ А ++; превращает $ a в ‘AA’, а в C a = ‘Z’; A ++; превращает a в ‘[‘ (ASCII-значение ‘Z’ равно 90, ASCII-значение ‘[‘ равно 91). Обратите внимание, что символьные переменные могут увеличиваться, но не уменьшаться, и даже в этом случае поддерживаются только простые алфавиты и цифры ASCII (a-z, A-Z и 0-9). Увеличение / уменьшение других символьных переменных не имеет никакого эффекта, исходная строка не изменяется.
http://php.net/manual/en/language.operators.increment.php
Инкрементный оператор в строках является исключением. Это из другой системы счисления, чем большинство других операторов. Эту проблему проще описать цифрами. У тебя есть 1
, Это можно интерпретировать как 0001
или же 1000
, Это два разных числа. Интерпретация зависит от используемого оператора.
Вы используете оператор приращения в строке. Это не работает так, как вы думаете.
$str = 'z';
var_dump(++$str)
Выход:
aa
Если вы хотите перебрать каждую букву, range()
хорошо работает:
foreach (range('a', 'z') as $letter) {
....
}