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_multisort
和array_map
:
array_multisort(
array_map(function ($item) { return substr($item, 1); },$array),
array_map(function ($item) { return $item[0]; },$array),
$array
);
这里正在工作演示。