如何对这个版本值数组进行排序?
$available_databases = array(
"4.0.1",
"trunk",
"branch",
"4.1.0",
"4.0.3"
);
以便结果为
4.1.0
4.0.3
4.0.1
branch
trunk
如何对这个版本值数组进行排序?
$available_databases = array(
"4.0.1",
"trunk",
"branch",
"4.1.0",
"4.0.3"
);
以便结果为
4.1.0
4.0.3
4.0.1
branch
trunk
$isVersion = function($a) { return is_numeric( str_replace('.', '', $a) ); };
$sortFunction = function($a, $b) use($isVersion) {
if( $isVersion($a) && $isVersion($b) ) {
return version_compare($b, $a); // reversed for your proper ordering
} elseif( $isVersion($a) ) {
return -1;
} elseif( $isVersion($b) ) {
return 1;
} else {
return strcasecmp($a, $b);
}
};
usort($yourArray, $sortFunction);
usort函数允许您使用自定义比较回调函数。我已经为您编写了一个符合您要求的逻辑的回调函数:如果两个可比较的项目都是版本号,则使用version_compare函数进行比较,并反转参数以使其按降序排列。如果第二个可比较的项目是字符串,而第一个是版本号,则认为版本号“低于”字符串,反之亦然。如果两个项目都是字符串,则使用strcasecmp比较函数来确定正确的顺序。您可以使用PHP内置的数组操作等工具来帮助您完成大量繁重的工作,从而减少许多表面上的复杂性:
$names = preg_grep('/^\D/', $arr);
$versions = preg_grep('/^\d/', $arr);
usort($versions, 'version_compare');
usort($names, 'strcasecmp');
$sorted = array_merge(array_reverse($versions), $names);
可以使用一些数组函数和几个循环来完成。
示例:
<?php
$arr = array("4.0.1", "trunk", "branch", "4.1.0", "4.0.3", "1.2", "1.31", "1.10", "1.4.5");
natsort($arr);
$count = count($arr);
$alpha = array();
$new_arr = array();
for($i = 0; $i < $count; $i++) {
if(!is_numeric(str_replace('.', '', $arr[$i]))) {
$alpha[] = $arr[$i];
} else {
$new_arr[] = $arr[$i];
}
$arr[$i] = null;
}
rsort($new_arr);
sort($alpha);
$new_arr = array_merge($new_arr, $alpha);
var_dump($new_arr);
?>
你只需要反转 version_compare()
的评估。
代码:(演示)
$array = ["4.0.1", "trunk", "branch", "4.1.0", "4.0.3"];
usort($array, function($a, $b) {
return version_compare($b, $a);
});
var_export($array);
输出:
array (
0 => '4.1.0',
1 => '4.0.3',
2 => '4.0.1',
3 => 'branch',
4 => 'trunk',
)
PHP7.4开始,可以使用箭头函数语法。(演示)
usort($array, fn($a, $b) => version_compare($b, $a));
$a
和/或$b
不是版本号,词法排序(如strcasecmp
)已经将它们按正确顺序排序(先数字,然后是名称)。我认为您可以删掉中间的两个情况。 - cHaofunction
被标记为语法错误。我可以看到它在codepad中可以工作,但有什么办法可以让它在Eclipse中工作吗? - Radek