In case you need to handle more complex version numbers like alpha, beta,..., here is a little something that can help:function multiExplode($delimiters,$string){ $pattern = '/['.preg_quote($delimiters).']/'; return(preg_split( $pattern, $string ));}function isInteger($input){ return(ctype_digit(strval($input)));}function keepIntsStartArray($arr){ $nonIntMappings=[ "alpha"=>1, "beta"=>2, "gamma"=>3, "delta"=>4, "epsilon"=>5, "zeta"=>6, "eta"=>7, "theta"=>8, "iota"=>9, "kappa"=>10, "lambda"=>11, "mu"=>12, "nu"=>13, "xi"=>14, "omicron"=>15, "pi"=>16, "rho"=>17, "sigma"=>18, "tau"=>19, "upsilon"=>20, "phi"=>21, "chi"=>22, "psi"=>23, "omega"=>24, ]; $ret=[]; foreach($arr as $i){ if(!isInteger($i)){ if(!array_key_exists($i,$nonIntMappings)){ break; } $ret[]=$nonIntMappings[$i]; } $ret[]=$i; } return($ret);}function appVersionBigger($v1,$v2,$orEqual=false){ $delimiters=".-+"; $a1=keepIntsStartArray(multiExplode($delimiters,$v1)); $a2=keepIntsStartArray(multiExplode($delimiters,$v2)); $len=count($a1); if($len>count($a2)){ $len=count($a2); } for($i=0;$i<$len;$i++){ $n1=$a1[$i]; $n2=$a2[$i]; if($n1>$n2){ return(true); } if($n1<$n2){ return(false); } } if(count($a1)>count($a2)){ return(true); } if(count($a1)<count($a2)){ return(false); } return($orEqual);}// usage examples:$versions=[ "1.2.3-45"=>"1.2.3-45", "1.2.3-44"=>"1.2.3-45", "1.2.3-46"=>"1.2.3-45", "1.2.3"=>"1.2.3-45", "1.2.4"=>"1.2.3-45", "1.2.2"=>"1.2.3-45", "1.2"=>"1.2.3-45", "1.3"=>"1.2.3-45", "1.2.3-ios"=>"1.2.3-and", "1.2-ios"=>"1.2.3-and", "2-ios"=>"1.2.3-and", "1.2.3-alpha"=>"1.2.3-beta", "1.2.3-beta"=>"1.2.3-alpha", "1-gamma"=>"1.2.3-beta", "1-alpha"=>"1.2.3-beta",];foreach($versions as $v1=>$v2){ echo("v1: ".$v1."\tv2: ".$v2."\tgt: ".(appVersionBigger($v1,$v2,false)?"true":"false")."\tge: ".(appVersionBigger($v1,$v2,true)?"true":"false")."\n");}// output with php version 8.1.8:/*v1: 1.2.3-45 v2: 1.2.3-45 gt: false ge: truev1: 1.2.3-44 v2: 1.2.3-45 gt: false ge: falsev1: 1.2.3-46 v2: 1.2.3-45 gt: true ge: truev1: 1.2.3 v2: 1.2.3-45 gt: false ge: falsev1: 1.2.4 v2: 1.2.3-45 gt: true ge: truev1: 1.2.2 v2: 1.2.3-45 gt: false ge: falsev1: 1.2 v2: 1.2.3-45 gt: false ge: falsev1: 1.3 v2: 1.2.3-45 gt: true ge: truev1: 1.2.3-ios v2: 1.2.3-and gt: false ge: truev1: 1.2-ios v2: 1.2.3-and gt: false ge: falsev1: 2-ios v2: 1.2.3-and gt: true ge: truev1: 1.2.3-alpha v2: 1.2.3-beta gt: false ge: falsev1: 1.2.3-beta v2: 1.2.3-alpha gt: true ge: truev1: 1-gamma v2: 1.2.3-beta gt: true ge: truev1: 1-alpha v2: 1.2.3-beta gt: false ge: false*/