strcmp()是php中区分大小写的二进制安全字符串比较函数,返回0表示相等,负数表示首字符串字典序在前,正数表示在后;仅依赖符号判断顺序,不可比较具体数值;适用于精确字符串校验与usort排序。

strcmp() 是 PHP 中用于二进制安全的字符串比较函数,它不区分大小写(注意:这是常见误解!实际是区分大小写的),返回整数结果来表示两个字符串的字典序关系。掌握它对排序、条件判断、数据校验等场景非常实用。
strcmp() 的返回值逻辑
该函数接收两个字符串参数:strcmp($str1, $str2),比较基于 ASCII 值逐字符进行:
- 返回 0:两个字符串完全相等(长度和每个字符都相同)
- 返回 负数(通常是 -1):$str1 在字典序中排在 $str2 前面
- 返回 正数(通常是 1):$str1 在字典序中排在 $str2 后面
注意:返回的具体正/负数值不固定(PHP 不保证一定是 ±1),只应依赖符号判断顺序,不要直接比较是否等于 1 或 -1。
用 strcmp() 做精确相等判断
相比 == 或 ===,strcmp() 在某些场景下更可靠,尤其当变量可能为非字符串类型但需强制按字符串比较时:
-
if (strcmp($a, $b) === 0)确保按字符串规则严格比对,避免类型转换干扰 - 例如:
strcmp("0", 0)返回 1(因为 "0" 和整数 0 转为字符串后比较,但传入数字会先转为字符串再比较),而"0" == 0为 true —— 这里strcmp更符合“纯字符串视角” - 适合用于密码哈希校验、API token 匹配等需防松散比较漏洞的场合
配合 usort() 实现自定义字符串排序
在数组排序中,strcmp() 是 usort() 最常用的比较回调之一:
-
usort($arr, 'strcmp');可直接升序排列字符串数组 - 如需降序,可封装匿名函数:
usort($arr, function($a, $b) { return -strcmp($a, $b); }); - 支持多字段排序逻辑,比如先按姓名再按城市:
return strcmp($a['name'], $b['name']) ?: strcmp($a['city'], $b['city']);(?:表示前一个为 0 时才执行后一个)
常见误区与注意事项
使用时容易踩坑,需特别留心:
- 区分大小写:`strcmp("Apple", "apple")` 返回负数("A" ASCII 65
- 空字符串处理:`strcmp("", "a")` 返回负数,`strcmp("a", "")` 返回正数,空串永远排最前
-
中文支持有限:直接比较中文字符串依赖其编码(如 UTF-8 下按字节比较),可能导致乱序;需用
mb_strcmp()或Collator类处理多语言 -
NULL 或非字符串输入:传入
null会触发警告,建议提前is_string()判断或用strval()转换
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











