IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Comment gérer ma boucle avec <ul> et <li> imbriqués ? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut Comment gérer ma boucle avec <ul> et <li> imbriqués ?
    Bonjour,

    Je voudrais réaliser un affichage structuré (département puis décalé commune puis décalé voie puis décalé numéro) mais je n'y arrive pas, voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    $sql = "SELECT id, departement, commune, voie, numero FROM `adresses` ORDER BY departement, commune, voie, numero";
    if( $req = mysqli_query($mysql_linked, $sql) )
    {
    	if( mysqli_num_rows($req) > 0 )
    	{
    		$departement = '';
    		$commune = '';
    		$voie = '';
    		$numero = '';
     
    		$compteur = 0;
     
    		while($data = mysqli_fetch_assoc($req))
    		{
    			if( strcmp($departement, $data['departement']) !== 0 )
    			{
    				if( $compteur > 0 )
    				{
    					echo "</li></ul>";
    				}
    				echo "<ul><li>".$data['departement'];
    			}
     
    			if( strcmp($commune, $data['commune']) !== 0 )
    			{
    				if( $compteur > 0 )
    				{
    					echo "</li></ul></li></ul>";
    				}
    				echo "<ul><li>".$data['commune'];
    			}
     
    			if( strcmp($voie, $data['voie']) !== 0 )
    			{
    				if( $compteur > 0 )
    				{
    					echo "</li></ul>";
    				}
    				echo "<ul><li>".$data['voie'];
    			}
     
    			if( strcmp($numero, $data['numero']) !== 0 )
    			{
    				if( $compteur > 0 )
    				{
    					echo "</li>";
    				}
    				echo "<li>".$data['numero'];
    			}
     
    			$departement = $data['departement'];
    			$commune = $data['commune'];
    			$voie = $data['voie'];
    			$numero = $data['numero'];
     
    			$compteur++;
    		}
    	}
    	mysqli_free_result($req);
    }
    Merci d'avance pour votre aide,
    ZiP

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Par défaut
    Salut quel est le résultat actuel?

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    gérer 4 niveaux d'imbrications dans des listes en cascade, c'est autrement plus compliqué que ton petit bout de code. Tu dois faire très attention à l'ouverture et fermeture des balises html.

    Le meilleur moyen de procéder c'est d'écrire un code HTML final d'exemple avec les 4 niveaux imbriqués et d'essayer à partir de ce code de produire le PHP qui va te renvoyer le HTML à l'identique. Tout de suite tu vas te rendre compte que ce n'est pas évident du tout de jongler avec des niveaux imbriqués.

    Allez parce que c'est les fêtes, je te file la soluce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    <?php
     
    $sql = "SELECT `id`, `departement`, `commune`, `voie`, `numero` FROM `adresses` ORDER BY `departement`, `commune`, `voie`, `numero`";
     
    if ($req = mysqli_query($mysql_linked, $sql))
    {
        if (mysqli_num_rows($req) > 0)
        {
            $departement = '';
            $commune     = '';
            $voie        = '';
            $numero      = '';
     
            $hsc  = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
            $html = '<ul>';
     
            $html_numero = function($v, $new_voie) use (&$html, $hsc, &$numero)
            {
                if (mb_strlen($v) && strcmp($numero, $v) !== 0)
                {
                    // nouveau numéro de voie
                    if ($new_voie)
                    {
                        $html .= '<ul>';
                    }
                    $numero = $v;
                    $html  .= '<li>'.$hsc($v).'</li>';
                }
            };
     
            $html_voie = function($v, $new_commune) use (&$html, $hsc, &$numero, &$voie)
            {
                if (mb_strlen($v) && strcmp($voie, $v) !== 0)
                {
                    // nouvelle voie
                    // si numéro présent -> clôture du niveau inférieur
                    if ($numero !== '')
                    {
                        $html  .= '</ul>';
                        $numero = '';
                    }
     
                    // si voie renseignée alors clôture du niveau courant
                    if ($voie !== '')
                    {
                        $html .= '</li>';
                    }
     
                    if ($new_commune)
                    {
                        $html .= '<ul>';
                    }
     
                    $voie  = $v;
                    $html .= '<li>'.$hsc($v);
     
                    return true;
                }
     
                return false;
            };
     
            $html_commune = function($v, $new_departement) use (&$html, $hsc, &$numero, &$voie, &$commune)
            {
                if (mb_strlen($v) && strcmp($commune, $v) !== 0)
                {
                    // nouvelle commune
                    // si numéro présent -> clôture du niveau inférieur
                    if ($numero !== '')
                    {
                        $html  .= '</ul>';
                        $numero = '';
                    }
     
                    // si voie présente -> clôture du niveau inférieur
                    if ($voie !== '')
                    {
                        $html .= '</li></ul>';
                        $voie  = '';
                    }
     
                    // si commune renseignée alors clôture du niveau courant
                    if ($commune !== '')
                    {
                        $html .= '</li>';
                    }
     
                    if ($new_departement)
                    {
                        $html .= '<ul>';
                    }
     
                    $commune = $v;
                    $html   .= '<li>'.$hsc($v);
     
                    return true;
                }
     
                return false;
            };
     
            $html_departement = function($v) use (&$html, $hsc, &$numero, &$voie, &$commune, &$departement)
            {
                if (mb_strlen($v) && strcmp($departement, $v) !== 0)
                {
                    // nouveau département
                    // si numéro présent -> clôture du niveau inférieur
                    if ($numero !== '')
                    {
                        $html  .= '</ul>';
                        $numero = '';
                    }
     
                    // si voie présente -> clôture du niveau inférieur
                    if ($voie !== '')
                    {
                        $html .= '</li></ul>';
                        $voie  = '';
                    }
     
                    // si commune présente -> clôture du niveau inférieur
                    if ($commune !== '')
                    {
                        $html   .= '</li></ul>';
                        $commune = '';
                    }
     
                    // si département renseigné alors clôture du niveau courant
                    if ($departement !== '')
                    {
                        $html .= '</li>';
                    }
     
                    $departement = $v;
                    $html       .= '<li>'.$hsc($v);
     
                    return true;
                }
     
                return false;
            };
     
            while ($data = mysqli_fetch_assoc($req))
            {
                $new_departement = $html_departement($data['departement']);
                $new_commune     = $html_commune($data['commune'], $new_departement);
                $new_voie        = $html_voie($data['voie'], $new_commune);
                $html_numero($data['numero'], $new_voie);
            }
     
            // clôture finale
            if ($numero !== '')
                $html .= '</ul>';
     
            if ($voie !== '')
                $html .= '</li></ul>';
     
            if ($commune !== '')
                $html .= '</li></ul>';
     
            if ($departement !== '')
                $html .= '</li>';
     
            $html .= '</ul>';
     
            echo $html;
        }
    }
    Tu dois penser à sécuriser ton code avant affichage sinon bonjour les dégâts...

    Comme toujours ça sort du four, je n'ai absolument rien testé donc croisage des doigts.
    J'ai essayé de commenter mais bon je pense que ce n'est pas si évident de ne pas perdre le fil lol

  4. #4
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonsoir rawsrc,

    Merci pour votre réponse gentiment accompagnée du code !

    J'ai entre temps également avancé sur ma problématique avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    $sql = "SELECT id, departement, commune, voie, numero FROM `adresses` ORDER BY departement, commune, voie, numero";
    if( $req = mysqli_query($mysql_linked, $sql) )
    {
    	if( mysqli_num_rows($req) > 0 )
    	{
    		$departement = '';
    		$commune = '';
    		$voie = '';
    		$numero = '';
     
    		$profondeur = 0;
     
    		while($data = mysqli_fetch_assoc($req))
    		{
    			if( strcmp($departement, $data['departement']) !== 0 )
    			{
    				if( $profondeur == 0 )
    				{
    					echo "<ul><li>".$data['departement'];
    				}
    				elseif( $profondeur == 1 )
    				{
    					echo "</li></ul><ul><li>".$data['departement'];
    				}
    				elseif( $profondeur == 2 )
    				{
    					echo "</li></ul></li></ul><ul><li>".$data['departement'];
    				}
    				elseif( $profondeur == 3 )
    				{
    					echo "</li></ul></li></ul></li></ul><ul><li>".$data['departement'];
    				}
    				elseif( $profondeur == 4 )
    				{
    					echo "</li></ul></li></ul></li></ul></li></ul><ul><li>".$data['departement'];
    				}
    				$profondeur = 1;
    			}
     
    			if( strcmp($commune, $data['commune']) !== 0 )
    			{
    				if( $profondeur == 1 )
    				{
    					echo "<ul><li>".$data['commune'];
    				}
    				elseif( $profondeur == 2 )
    				{
    					echo "</li></ul><ul><li>".$data['commune'];
    				}
    				elseif( $profondeur == 3 )
    				{
    					echo "</li></ul></li></ul><ul><li>".$data['commune'];
    				}
    				elseif( $profondeur == 4 )
    				{
    					echo "</li></ul></li></ul></li></ul><ul><li>".$data['commune'];
    				}
    				$profondeur = 2;
    			}
     
    			if( strcmp($voie, $data['voie']) !== 0 )
    			{
    				if( $profondeur == 2 )
    				{
    					echo "<ul><li>".$data['voie'];
    				}
    				elseif( $profondeur == 3 )
    				{
    					echo "</li></ul><ul><li>".$data['voie'];
    				}
    				elseif( $profondeur == 4 )
    				{
    					echo "</li></ul></li></ul><ul><li>".$data['voie'];
    				}
    				$profondeur = 3;
    			}
     
    			if( strcmp($numero, $data['numero']) !== 0 )
    			{
    				if( !empty($data['numero']) )
    				{
    					if( $profondeur == 3 )
    					{
    						echo "<ul><li>".$data['numero'];
    					}
    					elseif( $profondeur == 4 )
    					{
    						echo "</li></ul><ul><li>".$data['numero'];
    					}
    					$profondeur = 4;
    				}
    			}
     
    			$departement = $data['departement'];
    			$commune = $data['commune'];
    			$voie = $data['voie'];
    			$numero = $data['numero'];
    		}
    	}
    	mysqli_free_result($req);
    }
    Merci,
    ZiP

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    J'ai regardé ton code et le HTML généré ne semble pas correspondre à un menu déroulant en cascade standard. Je te montre :
    Voici ce que j'ai exécuté en y mettant des données d'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    $departement = '';
    $commune = '';
    $voie = '';
    $numero = '';
     
    $profondeur = 0;
     
    $v = [
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'CHAMPS-ELYSEES', 'numero' => 66],
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'CHAMPS-ELYSEES', 'numero' => 72],
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'REPUBLIQUE', 'numero' => 100],
        ['departement' => '78', 'commune' => 'VERSAILLES', 'voie' => '', 'numero' => ''],
        ['departement' => '92', 'commune' => 'LA DEFENSE', 'voie' => '', 'numero' => '']
    ];
     
    foreach ($v as $data)
    {
        if( strcmp($departement, $data['departement']) !== 0 )
        {
            if( $profondeur == 0 )
            {
                echo "<ul><li>".$data['departement'];
            }
            elseif( $profondeur == 1 )
            {
                echo "</li></ul><ul><li>".$data['departement'];
            }
            elseif( $profondeur == 2 )
            {
                echo "</li></ul></li></ul><ul><li>".$data['departement'];
            }
            elseif( $profondeur == 3 )
            {
                echo "</li></ul></li></ul></li></ul><ul><li>".$data['departement'];
            }
            elseif( $profondeur == 4 )
            {
                echo "</li></ul></li></ul></li></ul></li></ul><ul><li>".$data['departement'];
            }
            $profondeur = 1;
        }
     
        if( strcmp($commune, $data['commune']) !== 0 )
        {
            if( $profondeur == 1 )
            {
                echo "<ul><li>".$data['commune'];
            }
            elseif( $profondeur == 2 )
            {
                echo "</li></ul><ul><li>".$data['commune'];
            }
            elseif( $profondeur == 3 )
            {
                echo "</li></ul></li></ul><ul><li>".$data['commune'];
            }
            elseif( $profondeur == 4 )
            {
                echo "</li></ul></li></ul></li></ul><ul><li>".$data['commune'];
            }
            $profondeur = 2;
        }
     
        if( strcmp($voie, $data['voie']) !== 0 )
        {
            if( $profondeur == 2 )
            {
                echo "<ul><li>".$data['voie'];
            }
            elseif( $profondeur == 3 )
            {
                echo "</li></ul><ul><li>".$data['voie'];
            }
            elseif( $profondeur == 4 )
            {
                echo "</li></ul></li></ul><ul><li>".$data['voie'];
            }
            $profondeur = 3;
        }
     
        if( strcmp($numero, $data['numero']) !== 0 )
        {
            if( !empty($data['numero']) )
            {
                if( $profondeur == 3 )
                {
                    echo "<ul><li>".$data['numero'];
                }
                elseif( $profondeur == 4 )
                {
                    echo "</li></ul><ul><li>".$data['numero'];
                }
                $profondeur = 4;
            }
        }
     
        $departement = $data['departement'];
        $commune = $data['commune'];
        $voie = $data['voie'];
        $numero = $data['numero'];
    }
    et voici le HTML obtenu :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <ul>
        <li>75
            <ul>
                <li>PARIS
                    <ul>
                        <li>CHAMPS-ELYSEES
                            <ul><li>66</li></ul>
                            <ul><li>72</li></ul>
                        </li>
                    </ul>
                    <ul>
                        <li>REPUBLIQUE
                            <ul><li>100</li></ul>
                        </li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
    <ul>
        <li>78
            <ul>
                <li>VERSAILLES
                    <ul><li></li></ul>
                </li>
            </ul>
        </li>
    </ul>
    <ul>
        <li>92
            <ul><li>LA DEFENSE

    Maintenant avec mon code et avec les mêmes données d'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    $v = [
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'CHAMPS-ELYSEES', 'numero' => 66],
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'CHAMPS-ELYSEES', 'numero' => 72],
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'REPUBLIQUE', 'numero' => 100],
        ['departement' => '78', 'commune' => 'VERSAILLES', 'voie' => '', 'numero' => ''],
        ['departement' => '92', 'commune' => 'LA DEFENSE', 'voie' => '', 'numero' => '']
    ];
     
    $departement = '';
    $commune     = '';
    $voie        = '';
    $numero      = '';
     
    $hsc  = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
    $html = '<ul>';
     
    $html_numero = function($v, $new_voie) use (&$html, $hsc, &$numero)
    {
        if (mb_strlen($v) && strcmp($numero, $v) !== 0)
        {
            // nouveau numéro de voie
            if ($new_voie)
            {
                $html .= '<ul>';
            }
            $numero = $v;
            $html  .= '<li>'.$hsc($v).'</li>';
        }
    };
     
    $html_voie = function($v, $new_commune) use (&$html, $hsc, &$numero, &$voie)
    {
        if (mb_strlen($v) && strcmp($voie, $v) !== 0)
        {
            // nouvelle voie
            // si numéro présent -> clôture du niveau inférieur
            if ($numero !== '')
            {
                $html  .= '</ul>';
                $numero = '';
            }
     
            // si voie renseignée alors clôture du niveau courant
            if ($voie !== '')
            {
                $html .= '</li>';
            }
     
            if ($new_commune)
            {
                $html .= '<ul>';
            }
     
            $voie  = $v;
            $html .= '<li>'.$hsc($v);
     
            return true;
        }
     
        return false;
    };
     
    $html_commune = function($v, $new_departement) use (&$html, $hsc, &$numero, &$voie, &$commune)
    {
        if (mb_strlen($v) && strcmp($commune, $v) !== 0)
        {
            // nouvelle commune
            // si numéro présent -> clôture du niveau inférieur
            if ($numero !== '')
            {
                $html  .= '</ul>';
                $numero = '';
            }
     
            // si voie présente -> clôture du niveau inférieur
            if ($voie !== '')
            {
                $html .= '</li></ul>';
                $voie  = '';
            }
     
            // si commune renseignée alors clôture du niveau courant
            if ($commune !== '')
            {
                $html .= '</li>';
            }
     
            if ($new_departement)
            {
                $html .= '<ul>';
            }
     
            $commune = $v;
            $html   .= '<li>'.$hsc($v);
     
            return true;
        }
     
        return false;
    };
     
    $html_departement = function($v) use (&$html, $hsc, &$numero, &$voie, &$commune, &$departement)
    {
        if (mb_strlen($v) && strcmp($departement, $v) !== 0)
        {
            // nouveau département
            // si numéro présent -> clôture du niveau inférieur
            if ($numero !== '')
            {
                $html  .= '</ul>';
                $numero = '';
            }
     
            // si voie présente -> clôture du niveau inférieur
            if ($voie !== '')
            {
                $html .= '</li></ul>';
                $voie  = '';
            }
     
            // si commune présente -> clôture du niveau inférieur
            if ($commune !== '')
            {
                $html   .= '</li></ul>';
                $commune = '';
            }
     
            // si département renseigné alors clôture du niveau courant
            if ($departement !== '')
            {
                $html .= '</li>';
            }
     
            $departement = $v;
            $html       .= '<li>'.$hsc($v);
     
            return true;
        }
     
        return false;
    };
     
    foreach ($v as $data)
    {
        $new_departement = $html_departement($data['departement']);
        $new_commune     = $html_commune($data['commune'], $new_departement);
        $new_voie        = $html_voie($data['voie'], $new_commune);
        $html_numero($data['numero'], $new_voie);
    }
     
    // clôture finale
    if ($numero !== '')
        $html .= '</ul>';
     
    if ($voie !== '')
        $html .= '</li></ul>';
     
    if ($commune !== '')
        $html .= '</li></ul>';
     
    if ($departement !== '')
        $html .= '</li>';
     
    $html .= '</ul>';
     
    echo $html;
    j'obtiens ceci :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <ul>
        <li>75
            <ul>
                <li>PARIS
                    <ul>
                        <li>CHAMPS-ELYSEES
                            <ul>
                                <li>66</li>
                                <li>72</li>
                            </ul>
                        </li>
                        <li>REPUBLIQUE
                            <ul>
                                <li>100</li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>
        </li>
        <li>78
            <ul>
                <li>VERSAILLES</li>
            </ul>
        </li>
        <li>92
            <ul>
                <li>LA DEFENSE</li>
            </ul>
        </li>
    </ul>
    Je te laisse conclure

  6. #6
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonsoir rawsrc,

    Il n'y a pas photo, ton code est beaucoup plus propre et fonctionnel que le mien

    J'ai cependant un problème, j'ai un décalage qui se créé sur une ligne.

    Après recherche, il s'avère que celui-ci est causé par ce type de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $v = [
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'CHAMPS-ELYSEES', 'numero' => 66],
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'CHAMPS-ELYSEES', 'numero' => 72],
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'REPUBLIQUE', 'numero' => 100],
        ['departement' => '78', 'commune' => 'VERSAILLES', 'voie' => '', 'numero' => ''],
        ['departement' => '78', 'commune' => 'VERSAILLES', 'voie' => 'RUE DU TEST', 'numero' => ''],
        ['departement' => '78', 'commune' => 'VERSAILLES', 'voie' => 'RUE DU TEST', 'numero' => '3'],
        ['departement' => '92', 'commune' => 'LA DEFENSE', 'voie' => '', 'numero' => '']
    ];
    Une voie puis la même voie avec des numéros.

    Merci pour ton aide,
    ZiP

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu aurais pu te dépatouiller seul, non ? Gérer ces cas de figures, ce n'est quand pas la mer à boire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    <?php
     
    $v = [
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'CHAMPS-ELYSEES', 'numero' => 66],
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'CHAMPS-ELYSEES', 'numero' => 72],
        ['departement' => '75', 'commune' => 'PARIS', 'voie' => 'REPUBLIQUE', 'numero' => 100],
        ['departement' => '78', 'commune' => 'VERSAILLES', 'voie' => '', 'numero' => ''],
        ['departement' => '78', 'commune' => 'VERSAILLES', 'voie' => 'RUE DU TEST', 'numero' => ''],
        ['departement' => '78', 'commune' => 'VERSAILLES', 'voie' => 'RUE DU TEST', 'numero' => '3'],
        ['departement' => '92', 'commune' => 'LA DEFENSE', 'voie' => '', 'numero' => '']
    ];
     
    $departement = '';
    $commune     = '';
    $voie        = '';
    $numero      = '';
     
    $hsc  = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
    $html = '<ul>';
     
    $html_numero = function($v, $new_voie) use (&$html, $hsc, &$numero)
    {
        if (mb_strlen($v) && strcmp($numero, $v) !== 0)
        {
            // nouveau numéro de voie
            if ($new_voie || ($numero === ''))
            {
                $html .= '<ul>';
            }
            $numero = $v;
            $html  .= '<li>'.$hsc($v).'</li>';
        }
    };
     
    $html_voie = function($v, $new_commune) use (&$html, $hsc, &$numero, &$voie)
    {
        if (mb_strlen($v) && strcmp($voie, $v) !== 0)
        {
            // nouvelle voie
            // si numéro présent -> clôture du niveau inférieur
            if ($numero !== '')
            {
                $html  .= '</ul>';
                $numero = '';
            }
     
            // si voie renseignée alors clôture du niveau courant
            if ($voie !== '')
            {
                $html .= '</li>';
            }
     
            if ($new_commune || ($voie === ''))
            {
                $html .= '<ul>';
            }
     
            $voie  = $v;
            $html .= '<li>'.$hsc($v);
     
            return true;
        }
     
        return false;
    };
     
    $html_commune = function($v, $new_departement) use (&$html, $hsc, &$numero, &$voie, &$commune)
    {
        if (mb_strlen($v) && strcmp($commune, $v) !== 0)
        {
            // nouvelle commune
            // si numéro présent -> clôture du niveau inférieur
            if ($numero !== '')
            {
                $html  .= '</ul>';
                $numero = '';
            }
     
            // si voie présente -> clôture du niveau inférieur
            if ($voie !== '')
            {
                $html .= '</li></ul>';
                $voie  = '';
            }
     
            // si commune renseignée alors clôture du niveau courant
            if ($commune !== '')
            {
                $html .= '</li>';
            }
     
            if ($new_departement)
            {
                $html .= '<ul>';
            }
     
            $commune = $v;
            $html   .= '<li>'.$hsc($v);
     
            return true;
        }
     
        return false;
    };
     
    $html_departement = function($v) use (&$html, $hsc, &$numero, &$voie, &$commune, &$departement)
    {
        if (mb_strlen($v) && strcmp($departement, $v) !== 0)
        {
            // nouveau département
            // si numéro présent -> clôture du niveau inférieur
            if ($numero !== '')
            {
                $html  .= '</ul>';
                $numero = '';
            }
     
            // si voie présente -> clôture du niveau inférieur
            if ($voie !== '')
            {
                $html .= '</li></ul>';
                $voie  = '';
            }
     
            // si commune présente -> clôture du niveau inférieur
            if ($commune !== '')
            {
                $html   .= '</li></ul>';
                $commune = '';
            }
     
            // si département renseigné alors clôture du niveau courant
            if ($departement !== '')
            {
                $html .= '</li>';
            }
     
            $departement = $v;
            $html       .= '<li>'.$hsc($v);
     
            return true;
        }
     
        return false;
    };
     
    foreach ($v as $data)
    {
        $new_departement = $html_departement($data['departement']);
        $new_commune     = $html_commune($data['commune'], $new_departement);
        $new_voie        = $html_voie($data['voie'], $new_commune);
        $html_numero($data['numero'], $new_voie);
    }
     
    // clôture finale
    if ($numero !== '')
        $html .= '</ul>';
     
    if ($voie !== '')
        $html .= '</li></ul>';
     
    if ($commune !== '')
        $html .= '</li></ul>';
     
    if ($departement !== '')
        $html .= '</li>';
     
    $html .= '</ul>';
     
    echo $html;
    d'autant plus que les modifs apportées au code sont archi légères (un test supplémentaire en ligne 26 et 53), m'enfin

  8. #8
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour rawsrc,

    Oui, j'aurai pu effectivement me dépatouiller tout seul.

    Notre échange a quand même été très instructif et j'ai appris plusieurs nouvelles choses dont notamment les fonctions inline et le "use".

    Merci beaucoup pour ton aide et bonnes fêtes de fin d'année,
    ZiP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 25/05/2010, 07h44
  2. [VB.Net/SQLite] Comment gérer ADO.Net avec ce type de Serveur BD ?
    Par PM_calou dans le forum Accès aux données
    Réponses: 20
    Dernier message: 06/08/2006, 19h42
  3. [PHP-JS] Comment créer une boucle avec des headers
    Par djinnwatcher dans le forum Langage
    Réponses: 10
    Dernier message: 17/07/2006, 15h48
  4. [DAO] Comment gérer les liens avec la bdd dans mes classes?
    Par Wormus dans le forum Autres
    Réponses: 6
    Dernier message: 22/02/2006, 16h14
  5. Réponses: 5
    Dernier message: 29/10/2004, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo