三大比較函數對比
| 函數 | 核心特性 | 返回值 | 典型場景 |
similar_text() | 計算匹配字符數、可得相似度百分比 | 匹配字符數(int),引用參數返回百分比 | 模糊匹配、去重、拼寫糾錯 |
strnatcmp() | 自然排序算法(數字按數值比較) | < 0 / 0 / > 0 | 文件名排序、版本號比較 |
strcasecmp() | 二進制安全、大小寫不敏感 | < 0 / 0 / > 0 | 用戶輸入驗證、關鍵字匹配 |
similar_text() — 相似度分析
int similar_text(string $str1, string $str2 [, float &$percent])
- 基於最長公共子序列算法,精度高但 O(N³) 複雜度,長字符串慎用
levenshtein() 更快(O(N·M)),但不直接給百分比
<?php
$str1 = 'hello world';
$str2 = 'hello peter';
$count = similar_text($str1, $str2, $percent);
echo "匹配字符數: $count\n"; // 6 ('hello ')
echo "相似度: $percent%\n"; // 54.545454...
?>
strnatcmp() — 自然排序比較
int strnatcmp(string $str1, string $str2)
- 大小寫敏感,對應
strnatcasecmp() 不敏感版
- 「自然算法」:
'file2.txt' < 'file10.txt'(按數值 2 < 10),而標準排序 'file10.txt' < 'file2.txt'(按字符 '1' < '2')
<?php
$files = ['file1.txt', 'file10.txt', 'file2.txt', 'file20.txt'];
usort($files, 'strnatcmp');
print_r($files);
/*
Array
(
[0] => file1.txt
[1] => file2.txt
[2] => file10.txt
[3] => file20.txt
)
*/
?>
strcasecmp() — 大小寫不敏感比較
int strcasecmp(string $str1, string $str2)
- 二進制安全:可比較含
\0 的字符串
- 等價於
strtolower($a) === strtolower($b) 但更高效、直接返回排序關係
- 對應敏感版
strcmp()
<?php
var_dump(strcasecmp('Hello', 'hello')); // 0 (相等)
var_dump(strcasecmp('Apple', 'Banana')); // -1 (Apple < Banana)
var_dump(strcasecmp('Zebra', 'apple')); // 1 (Zebra > apple)
?>
選擇指南
- 需相似度百分比 →
similar_text()(短字符串)
- 需編輯距離 →
levenshtein()
- 文件名/版本號自然排序 →
strnatcmp() / strnatcasecmp()
- 用戶輸入忽略大小寫判等 →
strcasecmp() === 0
- 簡單判等 →
=== 最快