通过尾随数字底带(自然),然后通过引导字母子字符串来对字符串进行排序



i有一系列字符串,这些字符串始终以字母的形式格式化,然后是数字。我需要先按数字对它们进行排序。

样本输入:

$data = [
    'A1',
    'A2',
    'A5',
    'A10',
    'B2',
    'B4',
    'C10',
    'B5',
    'C1',
    'B1',
    'C2',
];

我需要以下结果:

[
    'A1',
    'B1',
    'C1',
    'A2',
    'B2',
    'C2',
    'B4',
    'A5',
    'B5',
    'A10',
    'C10',
]

usort((允许您创建一个自定义排序规则,因此您可以创建一个将值拆分为字母和数字的规则,并比较这些

usort(
    $data,
    function($a, $b) {
        sscanf($a, '%[A-Z]%d', $ac, $ar);
        sscanf($b, '%[A-Z]%d', $bc, $br);
        return ($ar == $br) ? $ac <=> $bc : $ar <=> $br;
    }
);

demo

使用 array_multisort()对两个规则进行排序,首先删除非数字字符,然后按整数值进行排序,然后正常按前导字符串排序。

代码:(演示(

array_multisort(preg_replace('/D+/', '', $data), SORT_NUMERIC, $data);

不是最有效的,但是相当简洁的方法将是使用array_multisortarray_map

array_multisort(
    array_map(function ($item) { return substr($item, 1); },$array),
    array_map(function ($item) { return $item[0]; },$array),
    $array
);

这里正在工作演示。

最新更新