如何在PHP中获取最高版本号/标签

11

由于Bitbucket API没有提供获取仓库最新标签的方法,因此我不得不从所有标签的数组中获取它。

你怎么做呢?

我尝试过max,但它对某些数字无效,例如:

max(['1.0.8', '1.0.9', '1.0.10']);

返回“1.0.9”。

我知道标签只有三个数字,格式为a.b.c,不会有其他semver所接受的字符串,比如alpha等,因为我们对仓库的标签处理方式如此。

那么你该怎么做呢?

3个回答

15
$versions = ['1.0.8', '1.0.9', '1.0.10'];
usort($versions, 'version_compare');
echo end($versions);

请参考http://php.net/version_compare

如果您不想修改该数组:

echo array_reduce($versions, function ($highest, $current) {
    return version_compare($highest, $current, '>') ? $highest : $current;
});

2
哇,version_compare 的这一部分真是太棒了。如果一个部分包含特殊的版本字符串,它们将按照以下顺序处理:任何未在此列表中找到的字符串 < dev < alpha = a < beta = b < RC = rc < # < pl = p。 - Francesco de Guytenaere
这确实非常强大。 - deceze

1
通过使用version_compare函数:
function maxVersion($array)
{
    $max = null;

    foreach ($array as $version) {
        if (version_compare($max, $version) === -1) {
            $max = $version;
        }
    }

    return $max;
}

print(maxVersion(['1.0.8', '1.0.9', '1.0.10']));
// returns "1.0.10"

-1

因为你在这里处理的是字符串而不是数字,所以你将无法得到所需的结果。你可以尝试以下方法:

$version_numbers = str_replace(".","",['1.0.8', '1.0.9', '1.0.10']);
$max = max($version_numbers);

如果您一直在处理固定的a.b.c结构,那么通过替换小数点,您将得到一系列整数,这将让您相对容易地确定最大值。


2
当您发现1010是这三个数中的最大值时,您会返回什么?1010吗?您将如何将其转换为1.0.10 - Hanky Panky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接