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] Collapsable Nested Tree Récursivité !


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut [Tableaux] Collapsable Nested Tree Récursivité !
    Bonjour,
    ça fait trois heure que je pense au problème et j'ai la tête qui a arrêté de tourner..
    j'ai un tableau de la forme:

    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
    Array
    (
        [2] => Array
            (
                [Page] => Array
                    (
                        [id] => 2
                        [parentid] => 0
                        [name] => About Page
                        [urlval] => about
                        [sort_order] => 0
                    )
                [Parent] => Array
                    (
                        [id] => 
                        [parentid] => 
                        [name] => 
                        [urlval] => 
                        [sort_order] => 
                    )
                [childs] => Array
                    (
                        [3] => Array
                            (
                                [Page] => Array
                                    (
                                        [id] => 3
                                        [parentid] => 2
                                        [name] => Why
                                        [urlval] => why
                                        [sort_order] => 0
                                    )
                                [Parent] => Array
                                    (
                                        [id] => 2
                                        [parentid] => 0
                                        [name] => About Page
                                        [urlval] => about
                                        [sort_order] => 0
                                    )
                                [childs] => Array
                                    (
                                        [6] => Array
                                            (
                                                [Page] => Array
                                                    (
                                                        [id] => 6
                                                        [parentid] => 3
                                                        [name] => Show Room
                                                        [urlval] => showroom
                                                        [sort_order] => 0
                                                    )
                                                [Parent] => Array
                                                    (
                                                        [id] => 3
                                                        [parentid] => 2
                                                        [name] => Why
                                                        [urlval] => why
                                                        [sort_order] => 0
                                                    )
                                            )
                                    )
                            )
                    )
            )
      [5] => Array
            (
                [Page] => Array
                    (
                        [id] => 5
                        [parentid] => 0
                        [name] => Contact Us
                        [urlval] => contact
                        [sort_order] => 0
                    )
                [Parent] => Array
                    (
                        [id] => 
                        [parentid] => 
                        [name] => 
                        [urlval] => 
                        [sort_order] => 
                    )
            )
    )

    Pour afficher l'arbre entière j'utilise un truc du genre:

    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
    	function expanded($current)
    	{
    		$this->_expanded($this->tree,$current);
    	}
    	function _expanded($tr,$current,$level = 0)
    	{
    		foreach($tr as $t)
    		{
    			echo str_repeat('  ',$level);
    			if($t['Page']['urlval'] == $current) 
    			{
    				echo $t['Page']['name'];			
    			}
    			else
    			{
    				echo $this->Html->link($t['Page']['name'], "/mod/show/".$t['Page']['urlval'],null,false,true,true);
    			}
     
    			echo "<br/>";
     
    			if(isset($t['childs'])) 
    			{
    				$this->_expanded($t['childs'],$current,$level + 1);
    			}
    		}
    	}
    ça donne quelque chose comme ça

    About Page
    -hello
    -Why
    --Show Room
    Contact Us

    maintenant, je veux afficher l'arbre mais de la forme collapsable:
    c'est à dire si je suis à hello:
    About Page
    -hello
    --Why
    Contact Us
    si je suis à contact us ça donne
    About Page
    Contact Us
    est ce que quelqu'un à une idée, une approche ? ou un code prêt que je pourais étudier ?

    Merci d'avance

  2. #2
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    OK je me suis pencher un peu sur le problème et j'ai trouvé la solution
    Note To Self: Ne jamais coder quand t'as plus de 24h sans sommeil.

    Si quelqu'un est interéssé je vais décrire ma solution, si vous avez des amélioration n'hésitez pas..
    En fait, en partant d'une observation: Les noeuds qui doivent être afficher sont les noeuds qui sont:
    -Les noeuds racines.
    -les fils d'un noeud qui appartient au chemin de la racine de l'arbre vers le noeud courant.

    Dans un premier temps en récupère le chemin de la racine vers le noeud courant dans un tableau et on fait un comparatif récursif:

    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
     
    	function _getPathTo($tr,$urlval,$names = "")
    	{	
    		foreach($tr as $t)
    		{
    			if($t['Page']['urlval'] == $urlval)
    			{
    				return $names.$t['Page']['urlval'];
    			}
    			else
    			{
    				if(isset($t['childs']))
    				{
    					$name = $t['Page']['urlval'];
    					return $this->_getPathTo($t['childs'],$urlval,$names.$name.".");
    				}
    			}	
    		}
     
    	}
     
    function collapsable($current)
    	{
    		$this->current_path = explode(".",$this->_getPathTo($this->tree,$current));
    		$this->__collapsable($this->tree,$current);
    	}
     
    	function __collapsable($tr,$current,$level = 0)
    	{
    		foreach($tr as $t)
    		{
    			// $this->_isChildOfAncestor($t['Page']['urlval']))
    			if($t['Page']['parentid'] == 0 || in_array($t['Parent']['urlval'],$this->current_path))
    			{
    				echo str_repeat('&nbsp;&nbsp;',$level);
     
    				if($t['Page']['urlval'] == $current) 
    				{
    					echo "*".$this->Html->link($t['Page']['name'], "/mod/show/".$t['Page']['urlval'],null,false,true,true);
    				}
    				else
    				{
    					echo $this->Html->link($t['Page']['name'], "/mod/show/".$t['Page']['urlval'],null,false,true,true);	
    				}
    				echo "<br/>";
    			}	
     
     
    			if(isset($t['childs']))
    			{
    			 $this->__collapsable($t['childs'],$current,$level + 1);
    			}
    		}
    	}
    Voilà, j'éspére que ça va aider quelqu'un..

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

Discussions similaires

  1. Problème de traduction : nested tree ?
    Par EJ dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 04/09/2007, 17h45
  2. Réponses: 1
    Dernier message: 08/02/2007, 09h11
  3. [Tableaux] arborescence et récursivité
    Par waldo2188 dans le forum Langage
    Réponses: 2
    Dernier message: 16/08/2006, 13h09
  4. [POO] Représentation d'arbre (Nested Tree)
    Par zoullou dans le forum Langage
    Réponses: 3
    Dernier message: 20/06/2006, 16h27
  5. [Tableaux] Récursivité include / fonction
    Par francis m dans le forum Langage
    Réponses: 14
    Dernier message: 16/05/2006, 22h14

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