Подтвердить что ты не робот

PHP: version_compare() возвращает -1 при сравнении 5.2 и 5.2.0?

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 также равны)?

4b9b3361

Ответ 1

В документации говорится, что она сравнивает "две" строки с номером версии с версией PHP.

Вы сравниваете одну строку с номером версии с стандартизованной версией PHP с одной строкой номера версии, не связанной с PHP.

Ответ 2

Здесь представлена ​​измененная функция сравнения, которая ведет себя как ожидалось, обрезая компоненты суффикса нулевой версии, т.е. 5.2.05.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);
}

Ответ 3

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,...

Btw даже в документации указано:

Таким образом можно сравнивать не только версии с разными уровнями, например, "4.1" и "4.1.2", но и...