<?php
// quick & dirty way to barricade your code during version transitions
assert('version_compare("5", PHP_VERSION, "<"); // requires PHP 5 or higher');
?>
version_compare
(PHP 4 >= 4.0.7, PHP 5)
version_compare — Compara dos cadenas de número de versión "PHP-estándar"
Descripción
version_compare() compara dos cadenas de número de versión "PHP-estandarizadas". Esto es útil si quisiera escribir programas que trabajen solo en algunas versiones de PHP.
La función comienza por reemplazar _, - y + con un punto . en las cadenas de versión, y también inserta puntos . antes y después de cualquier secuencia no numérica, de modo que por ejemplo '4.3.2RC1' se convierte en '4.3.2.RC.1'. Luego separa los resultados como si se usara explode('.', $ver). Luego compara las partes de izquierda a derecha. Si una parte contiene cadenas de versión especiales, éstas son gestionadas en el siguiente orden: dev < alpha = a < beta = b < RC < pl. De este modo, no solo las versiones con diferentes niveles, como '4.1' y '4.1.2' pueden ser comparadas, sino que también cualquier versión específica de PHP que contenga un indicador de estado de desarrollo.
Lista de parámetros
- version1
-
Primer número de versión.
- version2
-
Segundo número de versión.
- operador
-
Si especifica el tercer argumento opcional operador , puede realizar pruebas por una relación en particular. Los operadores posibles son: <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne respectivamente. Mediante el uso de este argumento, la función devolverá TRUE si la relación es la especificada por el operador, o FALSE de lo contrario.
Valores retornados
version_compare() devuelve -1 si la primera versión es inferior a la segunda, 0 si son iguales, y +1 si la segunda es menor.
Ejemplos
Example #1 Ejemplo de version_compare()
<?php
// imprime -1
echo version_compare("4.0.4", "4.0.6");
// todos estos casos imprimen 1
echo version_compare("4.0.4", "4.0.6", "<");
echo version_compare("4.0.6", "4.0.6", "eq");
?>
Notes
Note: La constante PHP_VERSION almacena la versión actual de PHP.
version_compare
08-Mar-2008 02:54
31-Oct-2007 05:18
It should be noted that version_compare() considers 1 < 1.0 < 1.0.0 etc. I'm guessing this is due to the left-to-right nature of the algorithm.
30-Oct-2007 11:38
I know this is somewhat incomplete, but it did a fair enough job for what I needed. I was writing some code that needed done immediately on a server that was to be upgraded some time in the future. Here is a quick replacement for version_compare (without the use of the operator argument). Feel free to add to this / complete it.
<?php
function version_compare2($version1, $version2)
{
$v1 = explode('.',$version1);
$v2 = explode('.',$version2);
if ($v1[0] > $v2[0])
$ret = 1;
else if ($v1[0] < $v2[0])
$ret = -1;
else // Major ver are =
{
if ($v1[1] > $v2[1])
$ret = 1;
else if ($v1[1] < $v2[1])
$ret = -1;
else // Minor ver are =
{
if ($v1[2] > $v2[2])
$ret = 1;
else if ($v1[2] < $v2[2])
$ret = -1;
else
$ret = 0;
}
}
return $ret;
}
?>
31-Jul-2007 01:31
Yes; I was incorrect. However "1.0pl" is greater than "1.0.1", since "pl" comes after any number (this should perhaps be noted in the documentation: dev < alpha = a < beta = b < RC < # < pl)
12-Jun-2007 04:26
My concern at this point, is that Hayley Watson's comments may confuse some people - it did me, so I did some more investigation before replying...
According to all the unit tests (15) I have written using version_compare, I believe Hayley Watson is incorrect. For example, all of these calls are true.
function testVersionBeta3ToBeta4()
{
$this->assertTrue(opendb_version_compare('1.0b3', '1.0a4', '>'), '1.0b3 > 1.0a4');
}
function testVersionBeta6ToReleaseCandidate1()
{
$this->assertTrue(opendb_version_compare('1.0RC1', '1.0b6', '>'), 'RC1 > 1.0b6');
}
So how is this any different (which does not return true)
function testVersion10pl1To101()
{
$this->assertTrue(opendb_version_compare('1.0.1', '1.0pl1', '>'), '1.0.1 > 1.0pl1');
}
However when its changed to:
unction testVersion10pl1To101()
{
$this->assertTrue(opendb_version_compare('1.0.1', '1.0pl1', '>'), '1.0.1 > 1.0.0pl1');
}
It works fine. I do believe that the version_compare function works as follows:
$version1 $operator $version2
11-Jun-2007 09:47
To correct opendb at iamvegan dot net's misapprehension: "1.0pl1" is regarded as less than "1.0.1". But the call as you've written it asks whether "1.0pl1" is greater (">") than "1.0.1" - which it isn't.
11-Jun-2007 08:01
Something that may trip some folks up, but is useful to mention is that the following version comparison does not work quite as I expected:
version_compare('1.0.1', '1.0pl1', '>')
However, its quite easy to get working:
version_compare('1.0.1', '1.0.0pl1', '>')
23-Oct-2006 09:38
To answer elmuerte's note (06-Jul-2006 03:24), you'd even better remove spaces than replacing them.
<?php
version_compare("1.0.0.0beta1", "1.0.0.0alpha2") == 1; // good
version_compare("1.0.0.0-beta 1", "1.0.0.0-alpha 2") == 1;
version_compare("1.0.0.0.beta 1", "1.0.0.0.alpha 2") == 1;
version_compare("1.0.0.0.beta.1", "1.0.0.0.alpha.2") == 1;
?>
29-Sep-2004 05:28
If you're careful, this function actualy works quite nicely for comparing version numbers from programs other than PHP itself. I've used it to compare MySQL version numbers. The only issue is that version_compare doesn't recognize the 'gamma' addition that mysql uses as being later than 'alpha' or 'beta', because the latter two are treated specially. If you keep this in mind though, you should have no problems.
01-Jul-2004 10:40
Here's a wrapper which is more tolerant as far as order of arguments is considered:
<?php
function ver_cmp($arg1, $arg2 = null, $arg3 = null) {
static $phpversion = null;
if ($phpversion===null) $phpversion = phpversion();
switch (func_num_args()) {
case 1: return version_compare($phpversion, $arg1);
case 2:
if (preg_match('/^[lg][te]|[<>]=?|[!=]?=|eq|ne|<>$/i', $arg1))
return version_compare($phpversion, $arg2, $arg1);
elseif (preg_match('/^[lg][te]|[<>]=?|[!=]?=|eq|ne|<>$/i', $arg2))
return version_compare($phpversion, $arg1, $arg2);
return version_compare($arg1, $arg2);
default:
$ver1 = $arg1;
if (preg_match('/^[lg][te]|[<>]=?|[!=]?=|eq|ne|<>$/i', $arg2))
return version_compare($arg1, $arg3, $arg2);
return version_compare($arg1, $arg2, $arg3);
}
}
?>
It also uses phpversion() as a default version if only one string is present. It can make your code look nicer 'cuz you can now write:
<?php if (ver_cmp($version1, '>=', $version2)) something; ?>
and to check a version string against the PHP's version you might use:
<?php if (ver_cmp('>=', $version)) something; ?>
instead of using phpversion().
26-Jun-2004 06:02
This functionality is now implemented in the PEAR package PHP_Compat.
More information about using this function without upgrading your version of PHP can be found on the below link:
http://pear.php.net/package/PHP_Compat
22-Jun-2004 12:50
[editors note]
snipbit fixed after comment from Matt Mullenweg
--jm
[/editors note]
so in a nutshell... I believe it works best like this:
<?php
if (version_compare(phpversion(), "4.3.0", ">=")) {
// you're on 4.3.0 or later
} else {
// you're not
}
?>
24-May-2004 02:18
Actually, it works to any degree:
<?php
version_compare('1.2.3.4RC7.7', '1.2.3.4RC7.8')
version_compare('8.2.50.4', '8.2.52.6')
?>
will both give -1 (ie the left is lower than the right).
