運算符比較
| 運算符 | 比較類型 | 規則 | 示例 |
== | 鬆散比較 | 類型轉換後值相等 | 0 == "0" (true), 0 == "abc" (true!) |
=== | 嚴格比較 | 類型與值均相等 | 0 === "0" (false), "abc" === "abc" (true) |
!=, <> | 鬆散不等 | |
!== | 嚴格不等 | |
經典陷阱:數字字符串比較
<?php
var_dump("10" == "0xA"); // true (十六進制轉換)
var_dump("10" === "0xA"); // false
var_dump("1e2" == "100"); // true (科學計數法)
var_dump(" 10 " == "10"); // true (空白忽略)
var_dump("10.0" == "10"); // true
// 版本號比較陷阱
var_dump("10.0" > "9.0"); // true (字符串逐字符比較 '1' > '9'? 實際 '1' < '9' -> false!)
// 字符串比較:'1' (49) < '9' (57) -> "10.0" < "9.0" 為 true
// 但 "2" > "10" -> true ('2' > '1')
?>
函數式比較(推薦用於排序/精確邏輯)
| 函數 | 大小寫 | 返回值 | 說明 |
strcmp | 敏感 | <0, =0, >0 | 二進制安全,逐字節比較 ASCII 碼 |
strcasecmp | 不敏感 | <0, =0, >0 | strcmp 忽略大小寫版 |
strncmp | 敏感 | <0, =0, >0 | 比較前 n 字符 |
strncasecmp | 不敏感 | <0, =0, >0 | |
strnatcmp | 敏感 | <0, =0, >0 | 自然排序:數字按數值比較 (2 < 10) |
strnatcasecmp | 不敏感 | <0, =0, >0 | 自然排序忽略大小寫 |
version_compare | - | -1,0,1 | 專門比較版本號字符串 |
自然排序實戰
<?php
$files = ['file1.txt', 'file10.txt', 'file2.txt', 'file20.txt'];
// 普通排序(字典序)
sort($files);
// ['file1.txt', 'file10.txt', 'file2.txt', 'file20.txt']
// 自然排序
natsort($files);
// ['file1.txt', 'file2.txt', 'file10.txt', 'file20.txt']
// 保持鍵名關聯
$files = ['a' => 'file10.txt', 'b' => 'file2.txt'];
natcasesort($files); // 不區分大小寫自然排序
?>
版本號比較
<?php
version_compare('1.0.0', '1.0.1'); // -1
version_compare('1.0.10', '1.0.9'); // 1 (自然排序邏輯)
version_compare('1.0.0-alpha', '1.0.0'); // -1
version_compare('1.0.0', '1.0.0', '>='); // false (可用運算符形式)
?>
排序回調函數模式
<?php
$arr = ['file10.txt', 'file2.txt', 'file1.txt'];
// usort + strnatcmp
usort($arr, 'strnatcmp');
// ['file1.txt', 'file2.txt', 'file10.txt']
// 多字段排序:先按長度,再自然排序
usort($arr, function($a, $b) {
$lenDiff = strlen($a) - strlen($b);
if ($lenDiff !== 0) return $lenDiff;
return strnatcmp($a, $b);
});
?>
多字節字符串比較
strcmp 等按字節比較,UTF-8 中文會按字節序排序(非拼音/筆畫)。需用 Collator (intl 擴展)。
<?php
if (extension_loaded('intl')) {
$coll = new Collator('zh_CN');
$arr = ['张三', '李四', '王五'];
$coll->sort($arr); // 按拼音/筆畫排序
print_r($arr);
}
?>
總結選擇指南
- 判斷相等:
===(類型安全),避免 ==。
- 排序/比較大小:
- 純 ASCII/已知編碼:
strcmp/strnatcmp
- 版本號:
version_compare
- 中文/多語言:
Collator (intl)
- 忽略大小寫:
strcasecmp/strnatcasecmp。
- 前綴匹配:
strncmp/strncasecmp 或 str_starts_with (PHP 8+)。