Сравнение двух строк версии в PHP

Как сравнить две строки в формате версии? так что:

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 и так далее.