PHP実装のバージョン番号比較
8369 ワード
/*
* 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
";
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 "
";