Ответ 1
В документации говорится, что она сравнивает "две" строки с номером версии с версией PHP.
Вы сравниваете одну строку с номером версии с стандартизованной версией PHP с одной строкой номера версии, не связанной с PHP.
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 также равны)?
В документации говорится, что она сравнивает "две" строки с номером версии с версией PHP.
Вы сравниваете одну строку с номером версии с стандартизованной версией PHP с одной строкой номера версии, не связанной с PHP.
Здесь представлена измененная функция сравнения, которая ведет себя как ожидалось, обрезая компоненты суффикса нулевой версии, т.е. 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);
}
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", но и...