版本号对比
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