Как сравнить две строки в формате версии? так что:
version_compare("2.5.1", "2.5.2") => -1 (smaller) version_compare("2.5.2", "2.5.2") => 0 (equal) version_compare("2.5.5", "2.5.2") => 1 (bigger) version_compare("2.5.11", "2.5.2") => 1 (bigger, eleven is bigger than two)
Из интерактивного приглашения PHP с использованием функции version_compare
, встроенной в PHP с 4.1 :
php > print_r(version_compare("2.5.1", "2.5.2")); // expect -1 -1 php > print_r(version_compare("2.5.2", "2.5.2")); // expect 0 0 php > print_r(version_compare("2.5.5", "2.5.2")); // expect 1 1 php > print_r(version_compare("2.5.11", "2.5.2")); // expect 1 1
Кажется, PHP работает, как вы ожидаете. Если вы сталкиваетесь с другим поведением, возможно, вам следует это указать.
Если ваш вариант сравнения не работает, приведенный ниже код даст ваши результаты.
function new_version_compare($s1,$s2){ $sa1 = explode(".",$s1); $sa2 = explode(".",$s2); if(($sa2[2]-$sa1[2])<0) return 1; if(($sa2[2]-$sa1[2])==0) return 0; if(($sa2[2]-$sa1[2])>0) return -1; }
Кроме того, вы можете использовать встроенную функцию PHP, как показано ниже, передав дополнительный аргумент version_compare()
if(version_compare('2.5.2', '2.5.1', '>')) { print "First arg is greater than second arg"; }
Дополнительную информацию см. В разделе version_compare .
Отмеченный ответ не подходит для случая:
print_r (version_compare ("2.51.1", "2.5.1"));
Вот более надежное решение для этого:
function updateAppVersion($appVersion1, $appVersion2) { $releaseVersion = explode(".",$appVersion1); $deviceVersion = explode(".",$appVersion2); if($releaseVersion[0] > $deviceVersion[0]) return false; if((floatval($releaseVersion[0].'.'.$releaseVersion[1])) > (floatval($deviceVersion[0].'.'.$deviceVersion[1]))) return false; //in some cases, versions are numbered only up to 2 decimal places if(isset($releaseVersion[2]) && isset($deviceVersion[2])) if($releaseVersion[2] >= $deviceVersion[2]) return false; return true; }
что вы можете сделать, это проанализировать каждую строку, остановиться в точке и добавить каждое число в отдельный int.
так что ваша строка 2.5.1 станет 3 целыми числами:
$ver1 . "." . $ver2 . "." . $ver3
и ваша строка 2.5.11 станет:
$ver1_2 . "." . $ver2_2 . "." . $ver3_2
то куча if для сравнения $ ver1 с $ ver1_2 и так далее.