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 :

Récursivité tableaux multidimensionnel en arbre


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2012
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 199
    Points : 71
    Points
    71
    Par défaut Récursivité tableaux multidimensionnel en arbre
    Bonjour,

    Je cherche à faire basculer mon tableau multidimensionnel vers un arbre (liste ul-li).
    Sauf que dans mon code j'obtiens <ul><li></li><ul></ul></ul> ce qui n'est pas correct.
    Je vois pas comment résoudre ce petit problème :

    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
     
    public static function maFonctionRecursive($parent = 0) {
        $tableau = array();
        $sql = self::getSousCategories($parent);
        foreach ($sql as $row) {
    	$id_categorie = $row['id_category'];
            $tableau[] = array(
    		'id_categorie' => $id_categorie,
    		'enfants' => self::maFonctionRecursive($id_categorie)
    	);
        }
        return $tableau;
    }   
     
    	public static function tab2arbre($tab, &$data){
    		foreach($tab as $key => $value)
    		{
    		  if(is_array($value))
    		  {
    			$data .= '<ul class="ul_arbre">';
    			self::tab2arbre($value, $data);
    			$data .= '</ul>';
    		  }
    		  else 
    		  {
    			$nom = self::getNameById($value);  
    			$data .= '<li id="'.$value.'" class="li_arbre">' . $nom. '</li>';
    		  }
    		}
    		return $data;
    	}
    et l'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $cat = Category::maFonctionRecursive();
    $data = '';
    $retour = Category::tab2arbre($cat, $data);
    echo $retour;
    Merci d'avance

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    En effet, un code valide est un code comme celui-ci :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <ul>
        <li><ul><!-- --></ul></li>
    </ul>

    Il n'y a pas à changer grand chose pour que ton code devienne valide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $data .= '<ul class="ul_arbre"><li>';
    self::tab2arbre($value, $data);
    $data .= '</li></ul>';
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2012
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 199
    Points : 71
    Points
    71
    Par défaut
    Je suis revenu sur mon problème, merci pour votre réponse. J'ai toujours un problème pour générer l'arbre.

    Je remets tout mon code :

    Affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    $retour = '';
    		$cat = Category::maFonctionRecursive();
    		print_r($cat);
    		$data = '';
    		$retour .= Category::tab2arbre($cat, $data);
    		echo $retour;
    fonctions :

    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
     
     
    public static function getNameById($id_category)
    	{
    		$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
    			SELECT name
    			FROM '._DB_PREFIX_.'category_lang cl
    			WHERE cl.id_category = '. (int) $id_category);
    		return $result;
    	}
     
    	public static function getSousCategories($id_category)
    	{
    		$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
    			SELECT DISTINCT c.id_category, cl.name
    			FROM '._DB_PREFIX_.'category c, '._DB_PREFIX_.'category_lang cl
    			WHERE c.id_category=cl.id_category
    			AND c.id_parent = '. (int) $id_category.'
    			AND cl.id_lang = '.(int) 1);
    		return $result;
    	}
     
    	public static function maFonctionRecursive($parent = 0) {
    	   $tableau = array();
    	   $sql = self::getSousCategories($parent);
    	   foreach ($sql as $row) {
    		  $id_categorie = $row['id_category'];
    		  $tableau[] = array(
    			 $id_categorie => self::maFonctionRecursive($id_categorie)
    		  );
    	   }
    	   return $tableau;
    	}   
     
    	public static function tab2arbre($tab, &$data){
    		foreach($tab as $key => $value)
    		{
    		  if(is_array($value) && count($value) > 0)
    		  {
    			$data .= '<ul><li>';
    			$data .= self::getNameById($key);
    			self::tab2arbre($value, $data);
    			$data .= '</li></ul>';
    		  }
    		  else 
    		  {
    			$data .= self::getNameById($key);
    		  }
    		}
    		return $data;
    	}
    Ce que je vois ensuite :

    Array ( [0] => Array ( [1] => Array ( [0] => Array ( [2] => Array ( [0] => Array ( [12] => Array ( [0] => Array ( [16] => Array ( ) ) [1] => Array ( [17] => Array ( ) ) ) ) [1] => Array ( [14] => Array ( ) ) [2] => Array ( [13] => Array ( ) ) ) ) ) ) )

    Nom : Capture.PNG
Affichages : 91
Taille : 2,7 Ko

    Alors qu'il devrait y avoir root avec sous categorie Accueil, Accueil avec comme sous categorie Electricité/Maconnerie/Carrelage, Electricité ayant pour categ test1 et test2

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    A vue de nez, je dirais que tu as un niveau de trop dans tes tableaux lors de la récupération des données. Essaye quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static function maFonctionRecursive($parent = 0) {
       $tableau = array();
       $sql = self::getSousCategories($parent);
       foreach ($sql as $row) {
    	  $id_categorie = $row['id_category'];
    	  $tableau[$id_categorie] = self::maFonctionRecursive($id_categorie);
       }
       return $tableau;
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2012
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 199
    Points : 71
    Points
    71
    Par défaut
    Finalement j'ai trouvé autrement :

    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
     
    public static function getSousCategories()
    	{
    		$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
    			SELECT DISTINCT c.id_category, cl.name, c.id_parent
    			FROM '._DB_PREFIX_.'category c, '._DB_PREFIX_.'category_lang cl
    			WHERE c.id_category=cl.id_category
    			AND cl.id_lang = '.(int) 1);
    		return $result;
    	}
     
    	public static function afficher_arbre($parent, $niveau, $array) {
    		$retour = '';
    		$niveau_precedent = 0;
    		if (!$niveau && !$niveau_precedent){
    			 $retour .= '<ul>';
    		}
    		foreach ($array as $noeud) {
    			if ($parent == $noeud['id_parent']) {
    				if ($niveau_precedent < $niveau){
    					 $retour .= '<ul>';
    				}
    				$retour .= '<li>' . $noeud['libelle'];
    				$niveau_precedent = $niveau;
    				$retour .= self::afficher_arbre($noeud['id_categorie'], ($niveau + 1), $array);
    			}
    		}
    		if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)){
    			 $retour .= '</ul></li>';
    		}else if ($niveau_precedent == $niveau){
    			 $retour .= '</ul>';
    		}else{
    			 $retour .= '</li>';
    		}
    		return $retour;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $retour = '';
    		$retour .= 'Catégorie : ';
    		$tableau = array();
    		$sql = Category::getSousCategories();
    		foreach ($sql as $row) {
    			$id_categorie = $row['id_category'];
    			$id_parent = $row['id_parent'];
    			$libelle = $row['name'];
    			$tableau[] = array('id_categorie' => $id_categorie, 'id_parent' => $id_parent, 'libelle' => $libelle);
    		}
    		$retour .= Category::afficher_arbre(1, 0, $tableau);
    Merci quand même !!

Discussions similaires

  1. [Tableaux] Récursivité array multidimensionnel
    Par yanice dans le forum Langage
    Réponses: 10
    Dernier message: 30/01/2008, 20h52
  2. Problème de tableaux multidimensionnels
    Par progfou dans le forum C#
    Réponses: 3
    Dernier message: 09/03/2007, 10h23
  3. AIDE sur Tableaux multidimensionnels
    Par orj30754 dans le forum C
    Réponses: 4
    Dernier message: 07/11/2006, 12h31
  4. Réponses: 4
    Dernier message: 31/08/2006, 16h31
  5. Réponses: 5
    Dernier message: 24/12/2005, 15h40

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