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

PHP 字串比較函數全解析:strcmp、strcasecmp、strnatcmp 等差異與應用

     編輯:PHP 綜合知識

前言

PHP 提供多種字串比較函數,行為差異常導致邏輯錯誤。本文系統整理 ==/===、strcmp 系列、strnatcmp 自然排序比較的規則、回傳值含義與適用場景。

一、 基礎比較運算子

運算子比較類型規則範例
==鬆散比較型別轉換後值相等22 == "22" → true
===嚴格比較型別與值皆相同22 === "22" → false
!=/<>鬆散不等同上
!==嚴格不等同上

建議: 預設使用 ===/!==,避免隱性型別轉換導致的驚喜(如 "0e123" == "0e456" 為 true,科學記號法比較)。

二、 strcmp 系列:二進位安全、區分大小寫

回傳值規則: <0(前<後)、0(相等)、>0(前>後)。

1. strcmp(區分大小寫)

strcmp("abcdd", "abcde"); // 1  >0,比較到 'd' vs 'e',d後
// 修正:strcmp 逐字元比較 ASCII 碼
// 'd'(100) vs 'e'(101) -> 100-101 = -1 <0,表示前<後
// 實際執行:strcmp("abcdd","abcde") 回傳 -1

2. strcasecmp(不區分大小寫)

strcasecmp("abcdd", "abcde"); // -1,同 strcmp 但先轉同大小寫
strcasecmp("ABC", "abc");     // 0

3. strncmp / strncasecmp(限定長度)

strncmp("abcdd", "abcde", 3);     // 0,僅比較前 3 字元 "abc"
strncasecmp("AbCdd", "aBcde", 3); // 0

三、 自然排序比較:strnatcmp / strnatcasecmp

解決「10.gif < 5.gif」的字典序問題,按人類直覺比較數字大小。

strcmp("10.gif", "5.gif");      // -1(字典序 '1' < '5')
strnatcmp("10.gif", "5.gif");   // 1  (自然序 10 > 5)
strnatcasecmp("10.GIF", "5.gif"); // 1

適用場景: 檔案名排序、版本號比較(v1.10 > v1.2)、含數字的 ID 排序。

四、 完整對照表

函數大小寫比較範圍典型用途
strcmp敏感全字串一般字串相等/排序
strcasecmp不敏感全字串用戶輸入、域名、Email 比對
strncmp敏感前 n 字元前綴匹配、協議頭檢查
strncasecmp不敏感前 n 字元同上,忽略大小寫
strnatcmp敏感全字串檔案名、版本號自然排序
strnatcasecmp不敏感全字串同上,忽略大小寫

五、 實戰範例:版本號排序

$versions = ['v1.2', 'v1.10', 'v1.1', 'v2.0', 'v1.3'];

usort($versions, function($a, $b) {
    // 移除 'v' 前綴再自然比較
    return strnatcmp(substr($a,1), substr($b,1));
});

print_r($versions);
/*
Array
(
    [0] => v1.1
    [1] => v1.2
    [2] => v1.3
    [3] => v1.10
    [4] => v2.0
)
*/

六、 常見坑點

  1. 回傳值非布林: 不能直接 if (strcmp($a,$b)) 判斷相等,必須 === 0。
  2. 多位元組字串: 以上函數按位元組比較,UTF-8 中文可能產生非預期結果。需用 mb_strcmp(需 mbstring 擴展)或轉碼後比較。
  3. == 陷阱: "00" == "0" 為 true,"0e123" == "0e456" 為 true(科學記號)。永遠用 === 或 strcmp。

結語

字串比較看似簡單,實則暗藏型別轉換、編碼、自然序等陷阱。記住:嚴格相等用 ===,排序/大小比較用 strcmp 系列,含數字自然排序用 strnatcmp,並留意多位元組場景補充 mb_* 函數。

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