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