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

Langage PHP Discussion :

[Tableaux] Fonction récursive pour remplir mon arbre ?


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Points : 62
    Points
    62
    Par défaut [Tableaux] Fonction récursive pour remplir mon arbre ?
    salut, j'éspére que c'est le bon endroit ou je peux trouver de l'aide

    j'ai trouvé un script javascript qui permet de créer mon arbre:
    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
    <script>
    <!--
    	m_wsTreeCtrl = new wsTreeCtrl();
    	m_wsTreeCtrl.initializeDocument();
     
    	// usage :
    	// InsItem(Parent Item, Text, Target)
    	Intro = m_wsTreeCtrl.InsItem(null, "Introduction", "", "_blank");
    	m_wsTreeCtrl.InsItem(Intro, "Contenu Introduction", "", "_blank");
     
    	Titre_1 = m_wsTreeCtrl.InsItem(null, "Titre 1", "", "_blank");
    	m_wsTreeCtrl.InsItem(Titre_1, "Description Titre 1", "", "_blank");
     
    	S_Titre_1_1 = m_wsTreeCtrl.InsItem(Titre_1, "Sous-titre 1-1", "", "_blank");
    	m_wsTreeCtrl.InsItem(S_Titre_1_1, "Contenu Sous-titre 1-1", "", "_blank");
     
    	S_Titre_1_2 = m_wsTreeCtrl.InsItem(Titre_1, "Sous-titre 1-2", "", "_blank");
    	m_wsTreeCtrl.InsItem(S_Titre_1_2, "Description Sous-titre 1-2", "", "_blank");
     
    	S_S_Titre_1_2_1 = m_wsTreeCtrl.InsItem(S_Titre_1_2, "Sous-sous-titre 1-2-1", "", "_blank");
    	m_wsTreeCtrl.InsItem(S_S_Titre_1_2_1, "Contenu Sous-sous-titre 1-2-1", "", "_blank");
     
    	S_S_Titre_1_2_2 = m_wsTreeCtrl.InsItem(S_Titre_1_2, "Sous-sous-titre 1-2-2", "", "_blank");
    	m_wsTreeCtrl.InsItem(S_S_Titre_1_2_2, "Contenu Sous-sous-titre 1-2-2", "", "_blank");
     
    	S_Titre_1_3 = m_wsTreeCtrl.InsItem(Titre_1, "Sous-titre 1-3", "", "_blank");
    	m_wsTreeCtrl.InsItem(S_Titre_1_3, "Contenu Sous-titre 1-3", "", "_blank");
     
    	Titre_2 = m_wsTreeCtrl.InsItem(null, "Titre 2", "", "_blank");
    	m_wsTreeCtrl.InsItem(Titre_2, "Contenu Titre 2", "", "_blank");
     
    	Conclusion = m_wsTreeCtrl.InsItem(null, "Conclusion", "", "_blank");
    	m_wsTreeCtrl.InsItem(Conclusion, "Contenu Conclusion", "", "_blank");
     
    	m_wsTreeCtrl.GenerateCode();
    	m_wsTreeCtrl.RecudeAllTree();
    //-->
    </script>
    Résultat : (Exemple pour un IDRapport=5 par exemple)



    le probleme maintenant c'est comment je peux créer mon arbre dynamiquement a partir d'une table mySQL :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE `elements` (
      `ID` int(11) NOT NULL default '0',
      `IDParent` int(11) default NULL,
      `IDRapport` int(11) NOT NULL, 
      `Libelle` varchar(254) default NULL,
      `Contenu` text,
      `Niveau` int(11) default NULL,
      PRIMARY KEY  (`ID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    sincerement je suis nulle en récursivité si quelqu'un peux me donner des suggestions sur la structure de ma table et peux me donner un coup de main je suis bloquée a ce probleme ca fait + de 2 semaines

    et Merci pour votre aide

  2. #2
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    l'objet javascript m_wsTreeCtrl semble gérer l'arbre, tu ne devrais pas avoir besoin de récursivité.

    une requête SQL avec un tri ascendant sur IDParent devrait suffire pour que ta boucle génère toutes les lignes InsItem... dans le style

    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
     
    <script>
    <!--
    	m_wsTreeCtrl = new wsTreeCtrl();
    	m_wsTreeCtrl.initializeDocument();
    <?php
    $requere = mysql_query("SELECT * FROM elements SORT BY IDParent ASC");
    while($InsItem = mysql_fetch_array($requete)) {
      $parent='null';
      if($InsItem['IDParent']) {$parent='i'.$InsItem['IDParent'];}
      echo 'i'.$InsItem['ID'].'=m_wsTreeCtrl.InsItem('.$parent.', "'.$InsItem['Libelle'].'", "", "_blank");'."\n";
    }
    ?>
    	m_wsTreeCtrl.GenerateCode();
    	m_wsTreeCtrl.RecudeAllTree();
    //-->
    </script>
    à améliorer

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Points : 62
    Points
    62
    Par défaut
    merci daniel61 pour ton aide mais ta solution ne marche pas pour moi

    ma table contient les données suivantes qui permettent d'avoir l'arbre dans mon 1er poste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ID       IDRapport   IDParent      Libelle                          
    1         1              0             Introduction      
    2         1              0             TITRE1             
    3         1              2             STITRE1-1        
    4         1              2             STITRE1-2               
    5         1              4             SSTITRE1-2-1        
    6         1              4             STITRE1-2-2                   
    7         1              2             STITRE1-3       
    8         1              0             TITRE2             
    9         1              0             Conclusion
    j'ai extrait ensuite les données dans un Tableau PHP que j'ai convertie ensuite en Tableau JavaScript
    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
    <?php 
    	mysql_connect("localhost", "root", "");
    	mysql_select_db("bd"); 
    	$Tableau = mysql_query("SELECT * FROM elements where IDRapport=1");
     
    	function TabPHP_to_JS($tableauPHP, $tableauJS) {
        	echo $tableauJS . " = new Array();";
        	for($i = 0; $i < count($tableauPHP); $i++) {
            	if (!is_array($tableauPHP[$i])) {
                	echo $tableauJS . "[" . $i . "] = '" . $tableauPHP[$i] . "';";
            	}
            	else {
                	TabPHP_to_JS($tableauPHP[$i], $tableauJS . "[" . $i . "]");
            	}
        	}
        	return;
    	}
     
    /////////////////////////////////////////////////////////////////
        $i = 0;
        while ($datamenu = mysql_fetch_array($Tableau)) {
            $Tab_php_ID[$i] = $datamenu["ID"];
            $Tab_php_Libelle[$i] = $datamenu["Libelle"];
            $Tab_php_IDParent[$i] = $datamenu["IDParent"];
            $i++;
        }
        echo "<script type='text/javascript'>";
            TabPHP_to_JS($Tab_php_ID, "Tab_ID");
            TabPHP_to_JS($Tab_php_Libelle, "Tab_Libelle");
            TabPHP_to_JS($Tab_php_IDParent, "Tab_IDParent");
        echo "</script> ";
    ?>

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Points : 62
    Points
    62
    Par défaut
    Bonsoir,
    j'ai presque atteint mon but, mais j'ai trouvé un probléme et j'espére que c'est facile a corriger

    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
    <?php 
    	mysql_connect("localhost", "root", "");
    	mysql_select_db("ma_bd"); 
     
    	$T_ID  = array();
    	$T_Libelle = array();
    	$T_IDParent  = array();
     
    	function ConsTableau($ID,$k){
    		$Tab_php_ID = array();
    		$Tab_php_Libelle = array();
    		$Tab_php_IDParent = array();
    			$tableau=mysql_query("select * from elements where IDRapport=1 and IDParent=".$ID." ");
    			$i=0;
    			while ( $datamenu = mysql_fetch_array ( $tableau ) )
    			{
    				$Tab_php_ID[$i] = $datamenu["ID"];
    				$Tab_php_Libelle[$i] = $datamenu["Libelle"];
    				$Tab_php_IDParent[$i] = $datamenu["IDParent"];
    				$i++;
    			}
    			for ( $j=0 ; $j < count($Tab_php_ID) ; $j++){
    					$T_ID[$k] = $Tab_php_ID[$j] ;
    					$T_Libelle[$k] = $Tab_php_Libelle[$j] ;
    					$T_IDParent[$k] = $Tab_php_IDParent[$j];
     
    					echo "<p>".$T_ID[$k]." ".$T_Libelle[$k]." ".$T_IDParent[$k];
     
    					$k++;
    					ConsTableau($Tab_php_ID[$j],$k);
    			}
    	}
     
    	ConsTableau(0,0);
     
    echo count($T_Titre);
     
    ?>
    a la fin mes Tableaux : T_Titre, T_Libelle, T_IDParent sont vides Pourquoi ?

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Points : 62
    Points
    62
    Par défaut
    2éme solution qui peut m'être utile :


    c'est que je voudrais intégrer du code javascript dans ma fonction ConsTableau

    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
    <?php 
    	mysql_connect("localhost", "root", "");
    	mysql_select_db("ma_bd"); 
     
    	$T_Titre  = array();
    	$T_Libelle = array();
    	$T_IDParent  = array();
     
    	function ConsTableau($ID,$k){
    		$Tab_php_ID = array();
    		$Tab_php_Libelle = array();
    		$Tab_php_IDParent = array();
    			$tableau=mysql_query("select * from elements where IDRapport=1 and IDParent=".$ID." ");
    			$i=0;
    			while ( $datamenu = mysql_fetch_array ( $tableau ) )
    			{
    				$Tab_php_ID[$i] = $datamenu["ID"];
    				$Tab_php_Libelle[$i] = $datamenu["Libelle"];
    				$Tab_php_IDParent[$i] = $datamenu["IDParent"];
    				$i++;
    			}
    			for ( $j=0 ; $j < count($Tab_php_ID) ; $j++){
    					$T_ID[$k] = $Tab_php_ID[$j] ;
    					$T_Libelle[$k] = $Tab_php_Libelle[$j] ;
    					$T_IDParent[$k] = $Tab_php_IDParent[$j];
     
    ///////////////////////////////////////////////////////////////////////////////////////
    Comment intégrer la ligne suivante (code javascript) dans cette partie de ma fonction : 
    window['v'+$T_ID[$k]]=m_wsTreeCtrl.InsItem(null, $T_Libelle[$k], "", "_blank");
    ($T_ID[i],$T_Libelle[i] sont des variables de PHP)
    ///////////////////////////////////////////////////////////////////////////////////////
    					$k++;
    					ConsTableau($Tab_php_ID[$j],$k);
    			}
    	}
     
    	ConsTableau(0,0);
     
    echo count($T_Titre);
     
    ?>

  6. #6
    Membre averti Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    Par défaut
    Comme ca !!

    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
    <?php 
    	mysql_connect("localhost", "root", "");
    	mysql_select_db("ma_bd"); 
     
    	$T_Titre  = array();
    	$T_Libelle = array();
    	$T_IDParent  = array();
     
    	function ConsTableau($ID,$k){
    		$Tab_php_ID = array();
    		$Tab_php_Libelle = array();
    		$Tab_php_IDParent = array();
    			$tableau=mysql_query("select * from elements where IDRapport=1 and IDParent=".$ID." ");
    			$i=0;
    			while ( $datamenu = mysql_fetch_array ( $tableau ) )
    			{
    				$Tab_php_ID[$i] = $datamenu["ID"];
    				$Tab_php_Libelle[$i] = $datamenu["Libelle"];
    				$Tab_php_IDParent[$i] = $datamenu["IDParent"];
    				$i++;
    			}
    			for ( $j=0 ; $j < count($Tab_php_ID) ; $j++){
    					$T_ID[$k] = $Tab_php_ID[$j] ;
    					$T_Libelle[$k] = $Tab_php_Libelle[$j] ;
    					$T_IDParent[$k] = $Tab_php_IDParent[$j];
    			                ?>
     
    window['v'+<? echo $T_ID[$k]; ?>]=m_wsTreeCtrl.InsItem(null,<? echo $T_Libelle[$k]; ?>, "", "_blank");
     
                                            <?php
    					$k++;
    					ConsTableau($Tab_php_ID[$j],$k);
    			}
    	}
     
    	ConsTableau(0,0);
     
    echo count($T_Titre);
     
    ?>

  7. #7
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par max44410
    Comme ca !!

    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
    <?php 
    	mysql_connect("localhost", "root", "");
    	mysql_select_db("ma_bd"); 
     
    	$T_Titre  = array();
    	$T_Libelle = array();
    	$T_IDParent  = array();
     
    	function ConsTableau($ID,$k){
    		$Tab_php_ID = array();
    		$Tab_php_Libelle = array();
    		$Tab_php_IDParent = array();
    			$tableau=mysql_query("select * from elements where IDRapport=1 and IDParent=".$ID." ");
    			$i=0;
    			while ( $datamenu = mysql_fetch_array ( $tableau ) )
    			{
    				$Tab_php_ID[$i] = $datamenu["ID"];
    				$Tab_php_Libelle[$i] = $datamenu["Libelle"];
    				$Tab_php_IDParent[$i] = $datamenu["IDParent"];
    				$i++;
    			}
    			for ( $j=0 ; $j < count($Tab_php_ID) ; $j++){
    					$T_ID[$k] = $Tab_php_ID[$j] ;
    					$T_Libelle[$k] = $Tab_php_Libelle[$j] ;
    					$T_IDParent[$k] = $Tab_php_IDParent[$j];
    			                ?>
     
    window['v'+<? echo $T_ID[$k]; ?>]=m_wsTreeCtrl.InsItem(null,<? echo $T_Libelle[$k]; ?>, "", "_blank");
     
                                            <?php
    					$k++;
    					ConsTableau($Tab_php_ID[$j],$k);
    			}
    	}
     
    	ConsTableau(0,0);
     
    echo count($T_Titre);
     
    ?>
    Merci max44410 pour ta réponse mais ca marche mieux comme ca :

    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
    <?php 
    	mysql_connect("localhost", "root", "");
    	mysql_select_db("ma_bd"); 
     
    	$T_Titre  = array();
    	$T_Libelle = array();
    	$T_IDParent  = array();
     
    	function ConsTableau($ID,$k){
    		$Tab_php_ID = array();
    		$Tab_php_Libelle = array();
    		$Tab_php_IDParent = array();
    			$tableau=mysql_query("select * from elements where IDRapport=1 and IDParent=".$ID." ");
    			$i=0;
    			while ( $datamenu = mysql_fetch_array ( $tableau ) )
    			{
    				$Tab_php_ID[$i] = $datamenu["ID"];
    				$Tab_php_Libelle[$i] = $datamenu["Libelle"];
    				$Tab_php_IDParent[$i] = $datamenu["IDParent"];
    				$i++;
    			}
    			for ( $j=0 ; $j < count($Tab_php_ID) ; $j++){
    					$T_ID[$k] = $Tab_php_ID[$j] ;
    					$T_Libelle[$k] = $Tab_php_Libelle[$j] ;
    					$T_IDParent[$k] = $Tab_php_IDParent[$j];
     
    echo "<script type=\"text/javascript\">\n";	
    echo "window['v'+'$Tab_php_IDTitre[$j]']=m_wsTreeCtrl.InsItem(null,'$Tab_php_Libelle[$j]', '', '');\n";
    echo "</script>\n";
    				ConsTableau($Tab_php_ID[$j],$j);
    			}
    	}
     
    	ConsTableau(0,0);
     
    echo count($T_Titre);
     
    ?>

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

Discussions similaires

  1. Fonction récursive pour obtenir un arbre
    Par TerrorOnCity dans le forum Langage
    Réponses: 9
    Dernier message: 31/05/2013, 00h49
  2. Réponses: 10
    Dernier message: 03/07/2006, 11h32
  3. Réponses: 8
    Dernier message: 29/06/2006, 15h37
  4. Fonctions récursives pour parcourir un arbre
    Par mikedavem dans le forum C
    Réponses: 4
    Dernier message: 05/06/2006, 12h00
  5. [C#]Erreur pour remplir mon dataset
    Par liliprog dans le forum Windows Forms
    Réponses: 16
    Dernier message: 15/07/2005, 19h03

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