PHP默认排序区分大小写,sort()和asort()按字节值比较,大写字母(如A=65)排在小写字母前,例如['Apple','apple','Banana']排序后为['Apple','Banana','apple']。

PHP 默认排序就是区分大小写的,不需要额外操作;但如果你要“取消”区分,才需要加标志位。
sort() 和 asort() 默认按字节值比较,大写字母排在小写前面
比如 sort() 对 ['Apple', 'apple', 'Banana'] 排序,结果是 ['Apple', 'Banana', 'apple']。因为 ASCII 中 A(65)a(97),所以所有大写都“更小”。这不是 bug,是 PHP 的默认行为(SORT_REGULAR 模式)。
- 这种行为对英文标题、文件名等场景容易出人意料
- 如果你的数组全是纯英文单词,且希望忽略大小写,不能只靠
strtolower()预处理——会丢失原始大小写格式 - 想保留原值显示、只改排序逻辑,就得用
SORT_FLAG_CASE
用 SORT_FLAG_CASE 实现不区分大小写的值排序
SORT_FLAG_CASE 必须和 SORT_STRING 或 SORT_NATURAL 组合使用(用 | 位运算),单独用无效。
- 对普通字符串排序:
sort($arr, SORT_STRING | SORT_FLAG_CASE) - 对带数字的字符串(如
img10.jpg)做自然排序:natsort($arr)不支持 flag,得换natcasesort($arr) -
asort($arr, SORT_STRING | SORT_FLAG_CASE)才能既保持键名关联,又忽略大小写 - 注意:PHP 5.4.0+ 才支持
SORT_FLAG_CASE,老版本只能自己写usort()回调
ksort() 没有内置大小写不敏感选项,得用 uksort()
ksort() 只接受 sort_flags,但不支持 SORT_FLAG_CASE。如果要按键名不区分大小写排序,必须用 uksort():
uksort($arr, function($a, $b) {
return strcasecmp($a, $b);
});
-
strcasecmp()是安全的 C 风格字符串比较,返回 -1 / 0 / 1 - 不要用
strtolower($a) 做布尔判断,会导致排序不稳定 - 如果键名含非 ASCII 字符(如中文、德语变音符号),
strcasecmp()可能不适用,得用mb_strcasecmp()(需开启 mbstring)
最容易被忽略的是:sort_flags 在不同函数中支持程度不同——sort()、asort()、rsort()、arsort() 支持 SORT_FLAG_CASE;ksort()、krsort() 不支持;natsort() 根本不接受 flag,只能换 natcasesort()。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











