按降序对软件版本数组进行排序


Sort an array of software versions in descending order

如何对版本值数组进行排序?

$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

您应该使用usort函数。

$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比较函数来确定正确的顺序

使用中的示例:codepad

您可以使用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));