Mélange des numéros de version
Array ( [0] => 4.0.1.6.0.0 [1] => 3.0.0.9.0.0 [2] => 3.0.0.6.1.2 [3] => 3.0.0.9.2.0 [4] => 3.0.0.12 [5] => 3.0.0.12.0.0 [6] => 3.0.0.6.2.0 [7] => 3.0.1.6.0.0 [8] => 5.9 [9] => 3.0.0.6.0.0 [10] => 3.0.0.9.0.0 )Tri des numéros de version
Array ( [0] => 3.0.0.6.0.0 [1] => 3.0.0.6.1.2 [2] => 3.0.0.6.2.0 [3] => 3.0.0.9.0.0 [4] => 3.0.0.9.0.0 [5] => 3.0.0.9.2.0 [6] => 3.0.0.12 [7] => 3.0.0.12.0.0 [8] => 3.0.1.6.0.0 [9] => 4.0.1.6.0.0 [10] => 5.9 )Canonisation des numéros de version
3.0.0.6.0.0
3.0.0.6.1.2
3.0.0.6.2.0
3.0.0.9.0.0
3.0.0.9.0.0
3.0.0.9.2.0
3.0.0.12.0.0
3.0.0.12.0.0
3.0.1.6.0.0
4.0.1.6.0.0
5.9.0.0.0.0Test de format des numéros de version
totoot : NO
35 : ok
3.5 : ok
3.5. : NO
3.5.11 : ok
4.5.6.7.8.9 : ok
1.2.3.4.5.6.7.8.9 : NO
1.2.3.A.5.6 : NOExtraction de la version complète des numéros de version
1.2.3.4.5.6 : 1.2.3.4.0.0
1.2.3.4.0.0 : 1.2.3.4.0.0
3.0.0.6.0.0 : 3.0.0.6.0.0
3.0.0.6.2.0 : 3.0.0.6.0.0
3.0.0.6.0.2 : 3.0.0.6.0.0
3.0.0.12.0.12 : 3.0.0.12.0.0<?php
/**
* @file traitement_numero_version.php
* @brief Page de manipulation de numéro de version (jusqu'à 6 nombres): tri et cannonisation.
*
* @author hughes monget
* @see http://www.monget.com/
*/
error_reporting(0);
echo
'
<style type="text/css">
p
{
font-weight: bold;
}
</style>
';
echo '<pre>';
$arr_test = array();
$arr_test[] = '3.0.0.6.0.0';
$arr_test[] = '3.0.0.6.2.0';
$arr_test[] = '3.0.0.9.0.0';
$arr_test[] = '3.0.0.9.0.0';
$arr_test[] = '3.0.0.9.2.0';
$arr_test[] = '3.0.0.12';
$arr_test[] = '3.0.0.12.0.0';
$arr_test[] = '3.0.0.6.1.2';
$arr_test[] = '3.0.1.6.0.0';
$arr_test[] = '4.0.1.6.0.0';
$arr_test[] = '5.9';
echo '<p>Mélange des numéros de version</p>';
shuffle($arr_test);
print_r($arr_test);
/**
* Cette fonction permet de rajouter des ".0" s'il en manque pour faire un split
*
* @param $str - string - IN - Un numéro de version "3.0.0.6" ou pas "to.to.to.to"
* @return string - "to.to.to.to.0.0"
*/
function completer_version($str)
{
if (($int_nombre = substr_count($str, '.')) < 5)
{
$str .= str_repeat('.0', 5 - $int_nombre);
}
return $str;
}
/**
* Cette fonction permet de comparer 2 numéros de version.
* Il vaudrait mieux qu'il soit contrôlé et canonisé avant.
* Elle peut être utilisée comme callback de comparaison pour la fonction usort.
*
* @param $mix_gauche - string - IN - Un numéro de version "3.0.0.6.2.0"
* @param $mix_droite - string - IN - Un numéro de version "3.0.0.9.0.0"
* @return integer - 0 en cas d'égalité, -1 si $mix_gauche < $mix_droite, +1
* +1 si $mix_gauche > $mix_droite
*/
function comparer_version($mix_gauche, $mix_droite)
{
$mix_gauche = completer_version($mix_gauche);
$mix_droite = completer_version($mix_droite);
list($g1, $g2, $g3, $g4, $g5, $g6) = explode('.', $mix_gauche);
list($r1, $r2, $r3, $r4, $r5, $r6) = explode('.', $mix_droite);
$g1 = is_null($g1) ? -1 : intval($g1); $g2 = is_null($g2) ? -1 : intval($g2);
$g3 = is_null($g3) ? -1 : intval($g3); $g4 = is_null($g4) ? -1 : intval($g4);
$g5 = is_null($g5) ? -1 : intval($g5); $g6 = is_null($g6) ? -1 : intval($g6);
$r1 = is_null($r1) ? -1 : intval($r1); $r2 = is_null($r2) ? -1 : intval($r2);
$r3 = is_null($r3) ? -1 : intval($r3); $r4 = is_null($r4) ? -1 : intval($r4);
$r5 = is_null($r5) ? -1 : intval($r5); $r6 = is_null($r6) ? -1 : intval($r6);
if ($g1 == $r1)
if ($g2 == $r2)
if ($g3 == $r3)
if ($g4 == $r4)
if ($g5 == $r5)
if ($g6 == $r6)
return 0;
else if ($g6 < $r6)
return -1;
else
return +1;
else if ($g5 < $r5)
return -1;
else
return +1;
else if ($g4 < $r4)
return -1;
else
return +1;
else if ($g3 < $r3)
return -1;
else
return +1;
else if ($g2 < $r2)
return -1;
else
return +1;
else if ($g1 < $r1)
return -1;
else
return +1;
}
function comparer_version_2($mix_gauche, $mix_droite)
{
list($g1, $g2, $g3, $g4, $g5, $g6) = explode('.', completer_version($mix_gauche));
list($r1, $r2, $r3, $r4, $r5, $r6) = explode('.', completer_version($mix_droite));
$int_retour = strcasecmp(sprintf(str_repeat('%03d', 6), $g1, $g2, $g3, $g4, $g5, $g6), sprintf(str_repeat('%03d', 6), $r1, $r2, $r3, $r4, $r5, $r6));
if ($int_retour == 0)
{
$glen = strlen($mix_gauche); $rlen = strlen($mix_droite);
if ($glen != $rlen) { $int_retour = ($glen > $rlen) ? +1 : -1; }
}
return $int_retour;
}
/**
* Cette fonction rajoute des 0 en fin de numéro de version pour avoir 6 nombres.
*
* @param $str_numero_version - string - IN - Un numéro de version "3.0.0.6";
* @return string - Un numéro de version complété par des 0: "3.0.0.6.0.0"
*/
function canoniser_version($str_numero_version)
{
return $str_numero_version . str_repeat('.0', 5 - substr_count($str_numero_version, '.'));
}
/**
* Cette fonction teste si la chaîne reçue a bien le format d'un numéro de version.
* "3", "3.2", "3.0.1", "3.0.0.6", "3.0.0.6.0.2"
*
* @param $str_numero_version - string - IN - Un numéro de version
* @return boolean - TRUE si c'est un numéro de version
*/
function est_numero_version($str_numero_version)
{
return preg_match('/^\d+(\.\d+){0,5}$/', $str_numero_version);
}
/**
* Cette fonction renvoie le version complète d'une version (full ou patch).
*
* @param $str_numero_version - string - IN - Un numéro de version "3.0.0.6.0.0", "3.0.0.6.2.0", "3.0.0.6.2.1"
* @return string - Le numéro de la version complète "3.0.0.6.0.0"
*/
function extraire_version_complete($str_numero_version)
{
return preg_replace('/^(\d+(\.\d+){3})(\.\d+){2}$/', '\\1.0.0', $str_numero_version);
}
echo '<p>Tri des numéros de version</p>';
usort($arr_test, 'comparer_version_2');
print_r($arr_test);
echo '<p>Canonisation des numéros de version</p>';
foreach ($arr_test as $k => $v)
{
echo canoniser_version($v).'<br />';
}
$arr_test = array();
$arr_test[] = 'totoot';
$arr_test[] = '35';
$arr_test[] = '3.5';
$arr_test[] = '3.5.';
$arr_test[] = '3.5.11';
$arr_test[] = '4.5.6.7.8.9';
$arr_test[] = '1.2.3.4.5.6.7.8.9';
$arr_test[] = '1.2.3.A.5.6';
echo '<p>Test de format des numéros de version</p>';
foreach ($arr_test as $k => $v)
{
echo "$v : ".(est_numero_version($v) ? 'ok' : 'NO');
echo '<br />';
}
echo '<p>Extraction de la version complète des numéros de version</p>';
$arr_test = array();
$arr_test[] = '1.2.3.4.5.6';
$arr_test[] = '1.2.3.4.0.0';
$arr_test[] = '3.0.0.6.0.0';
$arr_test[] = '3.0.0.6.2.0';
$arr_test[] = '3.0.0.6.0.2';
$arr_test[] = '3.0.0.12.0.12';
foreach ($arr_test as $k => $v)
{
echo "$v : ".extraire_version_complete($v);
echo '<br />';
}
echo '<hr />';
highlight_file(__FILE__);