<?php
/*
* 版本号比较 by sam 20170412
* @param $version1 版本A 如:5.3.2
* @param $version2 版本B 如:5.3.0
* @return int -1版本A小于版本B , 0版本A等于版本B, 1版本A大于版本B
*
* 版本号格式注意:
* 1.要求只包含:点和大于等于0小于等于2147483646的整数 的组合
* 2.boole型 true置1,false置0
* 3.不设位默认补0计算,如:版本号5等于版号5.0.0
* 4.不包括数字 或 负数 的版本号 ,统一按0处理
*
* @example:
* if (versionCompare('5.2.2','5.3.0')<0) {
* echo '版本1小于版本2';
* }
*/
function versionCompare($versionA,$versionB) {
if ($versionA>2147483646 || $versionB>2147483646) {
throw new Exception('版本号,位数太大暂不支持!','101');
}
$dm = '.';
$verListA = explode($dm, (string)$versionA);
$verListB = explode($dm, (string)$versionB);
$len = max(count($verListA),count($verListB));
$i = -1;
while ($i++<$len) {
$verListA[$i] = intval(@$verListA[$i]);
if ($verListA[$i] <0 ) {
$verListA[$i] = 0;
}
$verListB[$i] = intval(@$verListB[$i]);
if ($verListB[$i] <0 ) {
$verListB[$i] = 0;
}
if ($verListA[$i]>$verListB[$i]) {
return 1;
} else if ($verListA[$i]<$verListB[$i]) {
return -1;
} else if ($i==($len-1)) {
return 0;
}
}
}
//验证,应该放在另一个文件中
function myAssertHandler($file, $line) {
echo "验证失败,请检查: $file:$line \n";
exit;
}
assert_options(ASSERT_CALLBACK, 'myAssertHandler');
//常规验证
assert(versionCompare('5.3.2','5.3.1')===1);
assert(versionCompare('5','5.3.1')===-1);
assert(versionCompare('5.0.0','5')===0);
assert(versionCompare('5.0.1','5.2.1')===-1);
assert(versionCompare('5.0.0','5.0.1')===-1);
//0验证
assert(versionCompare('0.0.1','0.1.0')===-1);
assert(versionCompare('0','0') === 0);
assert(versionCompare('1.0','0') === 1);
assert(versionCompare('1.1','0') === 1);
//负数验证
assert(versionCompare('1.-1','0') === 1);
assert(versionCompare('-1','0') === 0);
//boolean验证
assert(versionCompare(true,false) === 1);
assert(versionCompare(false,true) === -1);
assert(versionCompare(true,'1.0.0') === 0);
assert(versionCompare(false,'0') === 0);
//字母验证
assert(versionCompare('a.a','0') === 0);
assert(versionCompare('0','a.a.0') === 0);
//超大数验证
assert(versionCompare('2147483645','2147483646') === -1);
try{
assert(versionCompare('2147483647','2147483648') === -1);
}catch(\Exception $e){
assert($e->getCode()===101);
}
echo "验证通过\n";
PHP实现的版本号比较
最新推荐文章于 2024-07-05 08:44:35 发布