是否有一种优雅的方法可以根据字符串的类型对字符串进行不同的排序?
例如,假设我有以下数据:
AB421
4TS3
4A521
6ACD
4R3
6BCE
4F
我需要按降序排序数字,按升序排序字母。
以上内容应如此排序:
AB421
6ACD
6BCE
4A521
4F
4R3
4TS3
看到6,4是数字下降,但字母是按升序排列的。如果要比较一个字母和数字,那么这封信必须是第一个。
我能想到的唯一方法是使用自定义回调排序函数,它将str_split我的字符串并手动比较所有内容,在过程中检查它的类型。但这看起来很笨拙,我不确定是否有一个聪明的PHP类型来解决这个问题。
有更好的方法吗?
答案 0 :(得分:0)
php中有两个排序函数uksort()和usort(),它们采用用户定义的比较函数。
在您的情况下,如果排序数据是数组的值,则可以使用usort()。 只需根据您的排序要求定义比较功能:
有关如何定义排序函数的一些示例,您可以在php manual中找到。
答案 1 :(得分:0)
你想要的是一个递归的usort()和一个自定义的比较器函数。此函数根据您的规则比较字符串的最左侧字符,如果字符相同,则递归地在两个字符串上向右移动相同的函数。
运行它,它完美无缺。
<?php
function cmp($a, $b) {
if($a[0] == $b[0]) {
return cmp(substr($a,1), substr($b,1));
} else if(is_numeric($a[0]) == is_numeric($b[0])) {
//this is where you compare numbers to numbers and letters to letters.
if(is_numeric($a[0])) {
return ($a[0] < $b[0]) ? 1 : -1;
} else {
return ($a[0] < $b[0]) ? -1 : 1;
}
} else if(is_numeric($a[0]) && !is_numeric($b[0])) {
return 1;
} else {
return -1;
}
}
$a = array(
"AB421",
"4TS3",
"4A521",
"6ACD",
"4R3",
"6BCE",
"4F"
);
print_r($a);
usort($a, "cmp");
print_r($a);
?>
该计划的输出是:
Array
(
[0] => AB421
[1] => 4TS3
[2] => 4A521
[3] => 6ACD
[4] => 4R3
[5] => 6BCE
[6] => 4F
)
Array
(
[0] => AB421
[1] => 6ACD
[2] => 6BCE
[3] => 4A521
[4] => 4F
[5] => 4R3
[6] => 4TS3
)
答案 2 :(得分:0)
您可以编写自己的排序功能。
您很容易理解自己在做什么。
它可以在任何地方使用。
function mySort ($input) {
$numberArray = array();
$stringArray = array();
foreach($inputas $c) {
$tt = substr($c, 0, 1);
if (is_numeric($tt)) {
$numberArray[] = $c;
} else {
$stringArray[] = $c;
}
}
sort($stringArray);
rsort($numberArray);
$newArray = array_merge($stringArray, $numberArray);
return $newArray;
}
示例:
$cars=array(
"AB421",
"YB421",
"4TS3",
'4A521',
"6ACD",
"4R3",
"6BCE",
"4F"
);
$ s = mySort($ cars);