PHP usort()半大小写敏感排序:strcasecmp替代方案咨询
解决大小写敏感的自定义排序问题
你当前用strcasecmp()的问题在于:当两个字符串仅大小写不同时,strcasecmp()会返回0,此时usort()的排序是不稳定的,导致顺序随机。要实现同内容时大写开头项优先的需求,需要在不区分大小写比较的基础上,增加一层区分大小写的二次比较。
替代方案代码
usort($users, function($a, $b) { // 第一步:不区分大小写比较内容 $caseInsensitive = strcasecmp($a['first_name'], $b['first_name']); if ($caseInsensitive !== 0) { return $caseInsensitive; } // 第二步:内容相同时,区分大小写比较,确保大写在前 return strcmp($a['first_name'], $b['first_name']); });
逻辑说明
- 先用
strcasecmp()做不区分大小写的排序,确保Amy、amy被归为同一组,同时Rebecca、stacy按字母顺序排列。 - 当
strcasecmp()返回0(即内容忽略大小写后相同),再用strcmp()做区分大小写的比较:由于大写字母的ASCII值小于小写字母(例如'A'=65,'a'=97),strcmp('Amy', 'amy')会返回负数,使得大写开头的项排在前面。
执行后预期结果
[ ['first_name' => 'Amy'], ['first_name' => 'amy'], ['first_name' => 'Rebecca'], ['first_name' => 'stacy'] ]
内容的提问来源于stack exchange,提问作者Lloyd Banks
相关产品推荐
相关产品推荐

