15
version_compare('5.2', '5.2.0'); // returns -1, as if the second parameter is greater!

5.2 和 5.2.0 不应该相等吗?(不是 5.2 和 5.2.0.0 也相等)?

4

4 回答 4

14

文档说它比较了“两个“PHP-standardized”版本号字符串。

您将一个 PHP 标准化版本号字符串与一个非 PHP 标准化版本号字符串进行比较。

于 2012-06-12T13:21:03.870 回答
10

这是一个经过调整的比较函数,通过修剪零版本后缀组件,即5.2.0-> ,其行为符合预期5.2

var_dump(my_version_compare('5.1', '5.1.0'));           //  0 - equal
var_dump(my_version_compare('5.1', '5.1.0.0'));         //  0 - equal
var_dump(my_version_compare('5.1.0', '5.1.0.0-alpha')); //  1 - 5.1.0.0-alpha is lower
var_dump(my_version_compare('5.1.0-beta', '5.1.0.0'));  // -1 - 5.1.0-beta is lower

function my_version_compare($ver1, $ver2, $operator = null)
{
    $p = '#(\.0+)+($|-)#';
    $ver1 = preg_replace($p, '', $ver1);
    $ver2 = preg_replace($p, '', $ver2);
    return isset($operator) ? 
        version_compare($ver1, $ver2, $operator) : 
        version_compare($ver1, $ver2);
}
于 2015-04-04T00:04:55.980 回答
4

5.2 和 5.2.0 都是 PHP 标准化的版本号字符串。AFAIU 5.2 代表 5.2.0、5.2.1 等。结果是合乎逻辑的,例如 5.2 不能等于 5.2.1 或 5.2.0,也不能大于 5.2.0。
所以只有预期的行为是 5.2 < 5.2.0, 5.2 < 5.2.1, ...

顺便说一句,甚至文档都指出:

这样不仅可以比较“4.1”和“4.1.2”等不同级别的版本,还可以比较...

于 2012-07-20T14:27:34.947 回答
0

快速 PHP 函数来确定一个版本是否高于其他版本:

$v1 = "1.101.9999";
$v2 = "1.2";

if ( semver($v1, $v2) ) {
    echo "v1 is greater than v2";
}

function semver($v1, $v2, $version_separator = ".") {

    // DTSC
    $v1_sub = explode($version_separator, $v1);
    $v2_sub = explode($version_separator, $v2);

    for ($i=0; $i < sizeof($v1_sub); $i++) {

        if ( !isset($v2_sub[$i]) ) {
            $v2_sub[$i] = 0;
        }
    
        if ( intval($v1_sub[$i]) > intval($v2_sub[$i]) ) {
            return true;
        } else if ( intval($v1_sub[$i]) < intval($v2_sub[$i]) ) {
            return false;
        }
    
    }

    return false; // Versions are equal - Change this value if you need a specific return for equal versions
}
于 2020-09-22T16:38:51.567 回答