<?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
07-Mar-2008 07:54
30-Oct-2007 10: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 04: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;
}
?>
11-Jun-2007 02: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', '>')
29-Sep-2004 11: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 04: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().
22-Jun-2004 06: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
}
?>
23-May-2004 08: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).
