php - php数组小写优先排序
问题描述
我寻找一种解决方案,仅对小写字母在前的数组进行排序。我知道正则表达式 [A-Za-z0-9] 的顺序。我喜欢订单 [a-zA-Z0-9]。不区分大小写的排序不是解决此问题的方法。
- 通常从 scandir() 排序:
- A001.TXT
- B002.TXT
- C003.TXT
- X004.TXT
- Y005.txt
- Z006.TXT
- a001.txt
- b002.TXT
- c003.txt
- x004.txt
- y005.TXT
- z006.txt
- 0001.TXT
- 1001.txt
- 2001.TXT
- 我喜欢这样的:
- a001.txt
- b002.TXT
- c003.txt
- x004.txt
- y005.TXT
- z006.txt
- A001.TXT
- B002.TXT
- C003.TXT
- X004.TXT
- Y005.txt
- Z006.TXT
- 0001.TXT
- 1001.txt
- 2001.TXT
解决方案
我们可以usort()
在这里尝试使用自定义比较器功能:
$arr = array(...);
function getOrder($input) {
$order = 4;
if (preg_match("/^[a-z]/", $input)) {
$order = 1;
}
else if (preg_match("/^[A-Z]/", $input)) {
$order = 2;
}
else if (preg_match("/^[0-9]/", $input)) {
$order = 3;
}
else {
$order = 4;
}
return $order;
}
usort($arr, function($a, $b) {
$a_order = getOrder($a);
$b_order = getOrder($b);
if ($a_order == $b_order) {
return strcmp($a, $b);
}
if ($a_order < $b_order) {
return -1;
}
else {
return 1;
}
});
$print_r($arr);
这打印:
Array
(
[0] => a001.txt
[1] => b002.TXT
[2] => c003.txt
[3] => x004.txt
[4] => y005.TXT
[5] => z006.txt
[6] => A001.TXT
[7] => B002.TXT
[8] => C003.TXT
[9] => X004.TXT
[10] => Y005.txt
[11] => Z006.TXT
[12] => 0001.TXT
[13] => 1001.txt
[14] => 2001.TXT
)
这里的策略是使用该getOrder()
函数来确定文件名是以小写、大写还是数字开头。对于这些情况中的每一个,我们都会分配一个优先级,按此顺序递增。然后,在与 一起使用的 lambda 比较器函数中usort()
,我们比较两个传入文件名的优先级。请注意,对于两个文件名碰巧以相同类型开头(例如都是小写)的情况,我们回退到strcmp()
确定哪个先出现。
推荐阅读
- c# - 将多种类型的列表组合成一个可迭代对象
- javascript - 是否可以更改最初相同范围的变量范围?
- pandas - 在不丢失索引名称的情况下将具有索引值的行追加/插入到索引数据框中?
- firebase - Flutter 从 google firebase 加载图像非常慢
- r - 仅返回列中的最后一个值(国家)
- regex - 使用正则表达式在点后添加空格,不包括数字和链接字符串之间的点
- c# - 将非常大的整数压缩成尽可能小的字符串
- typescript - 如何将外部 JS 库导入命名空间打字稿
- r - 按 purrr 中的条件合并列表中的数据框
- python - 寻找更简单的方法来划分 2 个数字 A 和 B,其中最大的总是分子