note 127315 added to function.version-compare

From: Date: Wed, 20 Jul 2022 22:05:35 +0000
Subject: note 127315 added to function.version-compare
Groups: php.notes 
Request: Send a blank email to php-notes+get-219045@lists.php.net to get a copy of this message
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: true v1: 1.2.3-44 v2: 1.2.3-45 gt: false ge: false v1: 1.2.3-46 v2: 1.2.3-45 gt: true ge: true v1: 1.2.3 v2: 1.2.3-45 gt: false ge: false v1: 1.2.4 v2: 1.2.3-45 gt: true ge: true v1: 1.2.2 v2: 1.2.3-45 gt: false ge: false v1: 1.2 v2: 1.2.3-45 gt: false ge: false v1: 1.3 v2: 1.2.3-45 gt: true ge: true v1: 1.2.3-ios v2: 1.2.3-and gt: false ge: true v1: 1.2-ios v2: 1.2.3-and gt: false ge: false v1: 2-ios v2: 1.2.3-and gt: true ge: true v1: 1.2.3-alpha v2: 1.2.3-beta gt: false ge: false v1: 1.2.3-beta v2: 1.2.3-alpha gt: true ge: true v1: 1-gamma v2: 1.2.3-beta gt: true ge: true v1: 1-alpha v2: 1.2.3-beta gt: false ge: false */ ---- Server IP: 45.112.84.4 Probable Submitter: 80.90.5.135 (proxied: 41.141.19.7) ---- Manual Page -- https://php.net/manual/en/function.version-compare.php Edit -- https://main.php.net/note/edit/127315 Del: integrated -- https://main.php.net/note/delete/127315/integrated Del: useless -- https://main.php.net/note/delete/127315/useless Del: bad code -- https://main.php.net/note/delete/127315/bad+code Del: spam -- https://main.php.net/note/delete/127315/spam Del: non-english -- https://main.php.net/note/delete/127315/non-english Del: in docs -- https://main.php.net/note/delete/127315/in+docs Del: other reasons-- https://main.php.net/note/delete/127315 Reject -- https://main.php.net/note/reject/127315 Search -- https://main.php.net/manage/user-notes.php

« previous php.notes (#219045) next »