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

PHP 字符串比較函數全解析:==, ===, strcmp, 自然排序

     編輯:PHP 相關知識

運算符比較

運算符比較類型規則示例
==鬆散比較類型轉換後值相等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, >0strcmp 忽略大小寫版
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+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved