zoukankan      html  css  js  c++  java
  • 版本号对比

    2016年3月17日 11:02:38 星期四

    逻辑一:

    1. 拆开点分的版本号

    2. 对每一项左边补齐0

    3. 重新拼接后, 逐位对比

    优点: 对传入的版本号无特别的要求, 重新拼接后从左往右逐位比对, 缺点: 慢

     1 /**
     2  * desc 点分小版本最多4位
     3  * @param $va 待检测版本
     4  * @param $vb 基准版本
     5  * @return int 如果 va 小于 vb 返回 < 0; 如果 va 大于 vb 返回 > 0;如果两者相等,返回 0
     6  */
     7 function compareVersion($va, $vb)
     8 {
     9     //小版本号补前导零
    10     $arrVersionA = explode('.', $va);
    11     $formatVersionA = '';
    12     foreach ($arrVersionA as $v) {
    13         $formatVersionA .= str_pad($v, 4, '0', STR_PAD_LEFT);
    14     }
    15 
    16     //小版本号补前导零
    17     $arrVersionB = explode('.', $vb);
    18     $formatVersionB = '';
    19     foreach ($arrVersionB as $v) {
    20         $formatVersionB .= str_pad($v, 4, '0', STR_PAD_LEFT);
    21     }
    22     
    23     //去掉末尾的0
    24     $formatVersionA = rtrim($formatVersionA, '0');
    25     $formatVersionB = rtrim($formatVersionB, '0');
    26     
    27     // echo $formatVersionA, ' ', $formatVersionB, ' ';
    28 
    29     return strcmp($formatVersionA, $formatVersionB);
    30 }
    31 
    32 echo '<pre>';var_dump(compareVersion('0.1.0', '0.1'));  // 00000001 00000001 int(0)
    33 echo '<pre>';var_dump(compareVersion('0.1.2', '0.2')); // 000000010002 00000002 int(-1)
    34 echo '<pre>';var_dump(compareVersion('0.1.2', '0.01.20')); // 000000010002 00000001002 int(-1)
    35 echo '<pre>';var_dump(compareVersion('0.1.2', '0.0.3')); // 000000010002 000000000003 int(1)
    36 echo '<pre>';var_dump(compareVersion('0.1.2', '0.1.2')); // 000000010002 000000010002 int(0)

    逻辑二:

    1. 用 vsprintf()函数将版本号格式化补前导零

    2. 逐位对比

    缺点: 必须要求版本号有三个小版本组成, 优点: 逻辑简单,快

     1 /**
     2  * desc 版本号必须由三个小版本组成, 每个小版本号最多4位
     3  * @param $va 待检测版本
     4  * @param $vb 基准版本
     5  * @return int 如果 va 小于 vb 返回 < 0; 如果 va 大于 vb 返回 > 0;如果两者相等,返回 0
     6  */
     7 function compareVersion($va, $vb)
     8 {
     9     $formatVersionA = vsprintf("%04d%04d%04d", explode('.', $va));
    10     $formatVersionB = vsprintf("%04d%04d%04d", explode('.', $vb));
    11 
    12     $formatVersionA = rtrim($formatVersionA, '0');
    13     $formatVersionB = rtrim($formatVersionB, '0');
    14     
    15     return strcmp($formatVersionA, $formatVersionB);
    16 }
    17 
    18 echo '<pre>';var_dump(compareVersion('0.1.2', '0.2.0'));  // -1
    19 echo '<pre>';var_dump(compareVersion('0.1.2', '0.01.20')); // -1
    20 echo '<pre>';var_dump(compareVersion('0.1.2', '0.0.3')); // 1
    21 echo '<pre>';var_dump(compareVersion('0.1.2', '0.1.2')); // 0

    SummerPHP 框架

  • 相关阅读:
    学习ActiveMQ(五):activemq的五种消息类型和三种监听器类型
    学习ActiveMQ(三):发布/订阅模式(topic)演示
    学习ActiveMQ(二):点对点(队列)模式消息演示
    Linux系统基础优化及常用命令
    【原创】Access自动编号的初始值设置及重置编号
    【整理】引用类型与ref传递实例精解
    【原创】数据库操作类库整理
    【摘录】Random快速产生相同随机数的原因及解决方案
    【整理】辗转相除法求最大公约数算法证明
    【转载】access采用sql语句与msql的区别
  • 原文地址:https://www.cnblogs.com/iLoveMyD/p/5286536.html
Copyright © 2011-2022 走看看