Подтвердить что ты не робот

Итерация символов 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,

Что кажется полным. Но когда я заменяю 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, 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, X, X, X, X, X, X, X, X, YG, YH, YI, YJ, YK, YL, YM, YN, YO, YP, YQ, YR, YS, YT, YU, YV, YW, YX, YY, YZ,

Любая причина такого поведения?

4b9b3361

Ответ 1

Прямо от Руководство PHP:

PHP следует за соглашением Perl при работе с арифметическими операциями над символьными переменными, а не с C. Например, в PHP и Perl $a = 'Z'; $А ++; превращает $a в 'AA', а в C a = 'Z'; A ++; превращает a в '[' (значение ASCII 'Z' равно 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.", ";
}

Все слова, состоящие из символов ASCII (диапазон A-Z), будут <= 'Z' до тех пор, пока вы не достигнете ZA, поскольку сопоставление представляет собой сравнение строк, а "AA" "Z", если строки отсортированы. См. Мой ответ на предыдущую версию этого вопроса

Ответ 3

Поздравляем, вы обнаружили одно из многих несоответствий в PHP. Короче говоря: + и < операторы работают по-разному в строках.

  • увеличение однобуквенной строки работает так, как вы ожидали бы
  • увеличение Z приводит к AA и т.д. (подумайте о столбцах Excel)
  • сравнение однобуквенных строк работает так, как вы ожидали бы
  • сравнение многобуквенных строк работает лексикографически (буква по букве)

Теперь интересный краевой случай:

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