PHP 提供多種字串比較函式,strcmp() 與 strcasecmp() 是最基礎的二元比較工具。兩者核心差異在於大小寫敏感度,本文詳細解析語法、回傳值、效能與實務應用陷阱。
| 特性 | strcmp() | strcasecmp() |
|---|---|---|
| 大小寫敏感 | 是 (Case-sensitive) | 否 (Case-insensitive) |
| 語法 | strcmp(string $s1, string $s2): int | strcasecmp(string $s1, string $s2): int |
| 相關函式 | strncmp() 可指定長度 | strncasecmp() 可指定長度 |
| PHP 版本 | 所有版本 | 所有版本 |
$result = strcmp($str1, $str2); // 回傳值規則: // 0 : 兩字串完全相等 // < 0 : $str1 小於 $str2 (ASCII 碼比較) // > 0 : $str1 大於 $str2
<?php $str1 = '碼農教程'; $str2 = '碼農教程'; $str3 = 'www.manongjc.com'; $str4 = 'WWW.MANONGJC.COM'; // strcmp:區分大小寫 echo "strcmp(相同): " . strcmp($str1, $str2) . "<br>"; // 0 echo "strcmp(大小寫不同): " . strcmp($str3, $str4) . "<br>"; // 非 0 (ASCII: 'w'=119, 'W'=87) // strcasecmp:不區分大小寫 echo "strcasecmp(大小寫不同): " . strcasecmp($str3, $str4) . "<br>"; // 0 // 進階:排序陣列 $arr = ['Banana', 'apple', 'Cherry', 'banana']; usort($arr, 'strcasecmp'); // 不分大小寫排序 print_r($arr); // ['apple', 'Banana', 'banana', 'Cherry'] ?>
strcmp:直接呼叫 C 函式 strcmp(),逐字元比較 ASCII 值strcasecmp:內部將字元轉為小寫後比較(當前 locale 影響)strcmp() : 0.18 秒 strcasecmp() : 0.24 秒 (額外大小寫轉換開銷) === 運算子 : 0.12 秒 (僅相等判斷,最快)
| 情境 | 錯誤寫法 | 正確寫法 | 說明 |
|---|---|---|---|
| 判斷相等 | if (strcmp($a,$b)) | if (strcmp($a,$b) === 0) | 非 0 視為 true,邏輯反向 |
| 排序比較 | usort($arr, 'strcmp') | usort($arr, 'strcasecmp') | 依需求決定是否分大小寫 |
| 多語系支援 | 直接使用 | Collator::compare() (intl 擴充) | Unicode 正規化、語系規則 |
| 嚴格相等 | strcmp($a,$b) == 0 | $a === $b 或 strcmp($a,$b) === 0 | === 同時檢查型別與值 |
$files = ['file1.txt', 'file10.txt', 'file2.txt'];
sort($files, SORT_STRING); // 標準:1, 10, 2
sort($files, SORT_NATURAL); // 自然序:1, 2, 10
natsort($files); // 同 SORT_NATURAL,保持鍵值
strnatcmp('file2', 'file10'); // 回傳 -1 (2 < 10)
strnatcasecmp('File2', 'FILE10'); // 不分大小寫自然序
$collator = new Collator('zh_TW'); // 繁體中文規則
$collator->setStrength(Collator::TERTIARY); // 區分大小寫、重音
echo $collator->compare('台北', '台中'); // 依中文排序規則
// ICU 正規化比較
normalizer_normalize('é', Normalizer::FORM_C); // 組合字元正規化
需求:比較兩字串
├─ 僅判斷相等/不等 → $a === $b (最快、型別安全)
├─ 需要排序/大小關係
│ ├─ 英文/ASCII、區分大小寫 → strcmp()
│ ├─ 英文/ASCII、不區分大小寫 → strcasecmp()
│ ├─ 檔案名稱/版本號自然序 → strnatcmp() / strnatcasecmp()
│ └─ 多語系/Unicode 正規排序 → Collator::compare() (intl)
└─ 部分比較 (前 N 字元) → strncmp() / strncasecmp()
精準選擇字串比較函式,不僅能避免邏輯錯誤,在大量資料排序、搜尋場景下更能顯著提升效能。