首页 > 解决方案 > php数组小写优先排序

问题描述

我寻找一种解决方案,仅对小写字母在前的数组进行排序。我知道正则表达式 [A-Za-z0-9] 的顺序。我喜欢订单 [a-zA-Z0-9]。不区分大小写的排序不是解决此问题的方法。

  1. 通常从 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
  2. 我喜欢这样的:
    • 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

标签: phpsorting

解决方案


我们可以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()确定哪个先出现。


推荐阅读