Mélange des numéros de version

Array ( [0] => 3.0.0.9.0.0 [1] => 3.0.0.6.0.0 [2] => 3.0.1.6.0.0 [3] => 3.0.0.6.2.0 [4] => 3.0.0.6.1.2 [5] => 4.0.1.6.0.0 [6] => 3.0.0.9.0.0 [7] => 3.0.0.12 [8] => 3.0.0.12.0.0 [9] => 3.0.0.9.2.0 [10] => 5.9 )

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.0

Test 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 : NO

Extraction 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'$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) ? -intval($g1); $g2 is_null($g2) ? -intval($g2);
    
$g3 is_null($g3) ? -intval($g3); $g4 is_null($g4) ? -intval($g4);
    
$g5 is_null($g5) ? -intval($g5); $g6 is_null($g6) ? -intval($g6);

    
$r1 is_null($r1) ? -intval($r1); $r2 is_null($r2) ? -intval($r2);
    
$r3 is_null($r3) ? -intval($r3); $r4 is_null($r4) ? -intval($r4);
    
$r5 is_null($r5) ? -intval($r5); $r6 is_null($r6) ? -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; }
    }
    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'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__);