| 參數 | 說明 |
$str1 | 第一個字串 |
$str2 | 第二個字串 |
$length | 比較字元數(必填) |
區分大小寫,按 ASCII 碼逐字元比較。回傳值:
0:前 $length 字元相等
< 0:$str1 較小
> 0:$str1 較大
基本範例
$str1 = "welcome to www.jb51.net";
$str2 = "WELCOME TO WWW.JB51.NET";
$str3 = "welcome to php";
echo strncmp($str1, $str2, 2); // 1 (w vs W,ASCII 119 > 87)
echo strncmp($str1, $str3, 2); // 0 (we vs we 相等)
與 strcmp()、strcasecmp() 差異比較
| 函式 | 比較範圍 | 大小寫 | 適用場景 |
strcmp | 整個字串 | 敏感 | 完整字串相等判斷 |
strncmp | 前 N 字元 | 敏感 | 前綴比對、排序分組 |
strcasecmp | 整個字串 | 不敏感 | 使用者輸入比對 |
strncasecmp | 前 N 字元 | 不敏感 | 前綴不分大小寫比對 |
實戰應用場景
1. 檢查字串前綴(如協議、標記)
function hasPrefix($str, $prefix) {
return strncmp($str, $prefix, strlen($prefix)) === 0;
}
var_dump(hasPrefix("https://example.com", "https://")); // true
var_dump(hasPrefix("https://example.com", "https://")); // false
2. 依前綴分組排序
$items = ['apple_1', 'banana_2', 'apple_3', 'cherry_4'];
usort($items, function($a, $b) {
return strncmp($a, $b, 5); // 只比前 5 字元
});
// 結果:apple_1, apple_3, banana_2, cherry_4
3. 解析固定寬度格式資料
$record = "20240115USER001PAID ";
$date = substr($record, 0, 8);
$type = substr($record, 8, 4);
if (strncmp($type, 'USER', 4) === 0) { /* 處理用戶記錄 */ }
效能提示
strncmp 為 C 層實作,極快,優於 substr($a,0,$n) === substr($b,0,$n)(避免建立子字串)。
- 大量比較時,若長度固定,可預先計算
$len = strlen($prefix) 避免重複呼叫。
- PHP 8.0+ 新增
str_starts_with($haystack, $needle) 語意更清晰,內部同樣優化,建議優先使用。
常見錯誤
- 長度超過字串長度:會比較到字串結尾,不會報錯,但結果可能非預期。
- 多位元組字串:
strncmp 按位元組比較,UTF-8 中文前綴比對會錯誤。請改用 mb_strncmp(需 mbstring 擴充)或先轉編碼。
- 混淆回傳值:記住
0 代表相等,非布林值,if (strncmp(...)) 判斷「不相等」時需寫 !== 0。
- 上一篇文章: WordPress wp_title() 函式深度解析:動態頁面標題生成指南
- 下一篇文章: PHP 基礎語法速查手冊:從變數到陣列的完整入門指南
Copyright ©
程式碼之家 All Rights Reserved