首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 字符串遞增運算深度解析:從 A 到 Z 再到 AA

     編輯:PHP 綜合知識

現象:為什麼 'Z'++ 會變成 'AA'?

<?php
for ($i = 'A'; $i <= 'Z'; $i++) {
    echo $i;
}
// 輸出:ABCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARAS…

預期只輸出 A-Z,實際卻在 Z 之後繼續輸出 AA、AB… 直到 YZ 才停止。原因在於 PHP 遵循 Perl 而非 C 的字符遞增規則。

官方文檔說明

PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in Perl ‘Z'+1 turns into ‘AA', while in C ‘Z'+1 turns into ‘[‘ ( ord(‘Z') == 90, ord(‘[‘) == 91 ). Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.

中文意譯:PHP 處理字符變量算術運算時沿用 Perl 慣例。Perl 中 'Z'+1 → 'AA',C 中 'Z'+1 → '['(ASCII 90→91)。字符變量只能遞增不能遞減,僅支援純 ASCII 字母(a-z、A-Z)。

核心規則總結

  1. 只能 ++,不能 --:--$name 無效果,值不變
  2. 進位規則如同 26 進制:Z → AA、AZ → BA、ZZ → AAA
  3. 字符串比較按字典序:'AA' < 'Z' 為 true,導致循環不會在 Z 停止
  4. 多字符串整體遞增:$name = "laruence"; ++$name → "laruencf"(最後一字符 f←e+1)

遞增演示

$name = "laruence";
++$name; // "laruencf"

$name = "laruence";
--$name; // 無效,仍為 "laruence"

循環陷阱分析

for ($i = 'A'; $i <= 'Z'; $i++) 中:

  • $i 從 'A' 遞增到 'Z' 正常
  • 執行 $i++ 後 $i 變 'AA'
  • 條件判斷 'AA' <= 'Z' → true(字典序 AA 排在 Z 前)
  • 繼續遞增:AB、AC… 直到 'ZA'、'ZB'… 'ZZ'、'AAA'…
  • 直到某值 > 'Z' 才停止,實際會跑很久

正確寫法:遍歷 A-Z

// 方法一:範圍配合 foreach
foreach (range('A', 'Z') as $char) {
    echo $char;
}

// 方法二:ord/chr 配合數值循環
for ($code = ord('A'); $code <= ord('Z'); $code++) {
    echo chr($code);
}

// 方法三:手動 break
for ($i = 'A'; ; $i++) {
    echo $i;
    if ($i === 'Z') break;
}

應用場景與避坑

  • Excel 欄位命名(A、B… Z、AA、AB…)可直接用遞增生成
  • 避免在條件判斷中直接用字符串遞增變量做邊界比較
  • 需要反向遍歷時,只能用數值循環配合 chr()

總結

PHP 字符串遞增是 Perl 風格的 26 進制進位,僅支援純字母遞增、不支援遞減。理解此機制能避免循環邊界錯誤,並可巧妙用於列名生成等場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved