php - 具有高优先级的具体值的用户排序
问题描述
我正在尝试实现一个函数,该函数将按词汇顺序(不区分大小写)对字符串数组进行排序。但有一个例外:如果字符串等于,让我们说“宾果!” 把这条线放在上面。
我做了一些在给定的测试数据上运行良好的函数。但我不确定我不会用特殊情况欺骗自己。请检查我。
<?php
$a = [
'alfa',
'beta',
'gama',
'sigma',
'foo',
'bar',
'bingo!',
];
usort($a, function ($a, $b) {
$cmp = strcasecmp($a, $b);
return $cmp == 0
? 0
: (strcasecmp($a, 'bingo!') == 0
? -1000
: (
strcasecmp($b, 'bingo!') == 0
? 1000
: $cmp
)
);
});
var_export($a);
解决方案
使用 usort 的解决方案:
$onTop = 'bingo!';
$array = [
'alfa',
'beta',
'gama',
'sigma',
'foo',
'bar',
'bingo!',
];
usort($array,function($a,$b) use($onTop){
$r = ($b == $onTop) <=> ($a == $onTop);
return $r==0 ? strnatcasecmp($a,$b) : $r;
});
var_export($array);
结果:
array (
0 => "bingo!",
1 => "alfa",
2 => "bar",
3 => "beta",
4 => "foo",
5 => "gama",
6 => "sigma",
)
推荐阅读
- angular - 将新项目推送到数组时,离子虚拟滚动未更新
- css - 如何在 Bootstrap 4 中使右列高度独立?
- r - 如何添加自定义 R 闪亮输入按钮?(最小的例子)
- asp.net-core-mvc - Kendo Grid 未绑定到 asp.net mvc 核心中的数据
- html - 使用 flexbox 移出父 div 的 div
- c# - 你可以在 Azure 应用服务中使用 System.Security.Cryptography.Cng.CngKey 吗?
- android - 如何检查 youtube 网址是否有用户名或频道?
- angular - Angular 和 Typescript 更新后找不到命名空间“MyApp”
- r-markdown - 是否可以在 Markdown 的 YAML 中为“首页”添加 tex 文件?
- c# - TFS 部署,在 Web 配置中放置其他属性