PHP实现的版本号比较

<?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";




  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值