classe recursive, erreur de logique introuvable... :( [résolu ^^']

classe recursive, erreur de logique introuvable... :( [résolu ^^'] - PHP - Programmation

Marsh Posté le 14-05-2005 à 18:38:52    

Salut tlm
 
Bon ca fait 2 heures que je cherche je trouve pas.
J'ai pas encore trop l'habitude des fonctions récursives, la je bloque. C'est surement une connerie mais bon.
 
Voici mon code :  

Code :
  1. <?php
  2. class TypeDroit {
  3. var $id=0;
  4. var $intitule="Racine";
  5. var $parent=NULL;
  6. var $fils=NULL;
  7. var $racine=false;
  8. var $niveau=0;
  9. // Constructeur
  10. function TypeDroit($tab=NULL, $cur_id=0, $niv=0) {
  11.  global $db_link;
  12.  // Instance racine -> on construit l'arbre
  13.  if(is_null($tab)) {
  14.   $tab=sql_query($db_link, "SELECT * FROM types_droits ORDER BY id_type_droit_parent DESC;" );
  15.   $this->racine=true;
  16.  }
  17.  // Recherche des données pour l'ID recu
  18.  if($cur_id!=0) {
  19.   for($i=0; $i<count($tab); $i++) {
  20.    if($tab[$i]['id_type_droit']==$cur_id) {
  21.     $this->id=$tab[$i]['id_type_droit'];
  22.     $this->parent=$tab[$i]['id_type_droit_parent'];
  23.     $this->intitule=$tab[$i]['intitule'];
  24.     $this->niveau=$niv+1;
  25.     break;
  26.    }
  27.   }
  28.  }
  29.  //echo str_repeat('&nbsp;', 8 * $this->niveau).$this->intitule.'--><br>';    
  30.  // On sauve les fils dans le tableau des fils
  31.  if($this->racine) {
  32.   // On recherche les enregistrements qui n'ont pas de parent (NULL)
  33.   for($i=0; $i<count($tab); $i++) {
  34.    if(is_null($tab[$i]['id_type_droit_parent'])) {
  35.     $this->fils[]=new TypeDroit($tab, $tab[$i]['id_type_droit'], $this->niveau);
  36.    }
  37.   }
  38.  }
  39.  else {
  40.   // On recherche les enregistrement qui ont pour parent l'ID en cours
  41.   for($i=0; $i<count($tab); $i++) {
  42.    if($tab[$i]['id_type_droit_parent']==$this->id) {
  43.     $this->fils[]=new TypeDroit($tab, $tab[$i]['id_type_droit'], $this->niveau);
  44.    }
  45.   }
  46.  }
  47. } // End constructeur
  48. function AfficheArbre() {
  49.  echo str_repeat('&nbsp;', 8 * $this->niveau).$this->intitule.'--><br>';
  50.  for($i=0; $i<count($this->fils)-1; $i++) {
  51.   $this->fils[$i]->AfficheArbre();
  52.  }
  53. }
  54. } // End class
  55. ?>


 
Il s'agit d'une classe qui recherche les differents droits que peuvent avoir des utilisateurs  pour mon application dans une table. Jusque la pas de prob. Mais on s'en fout un peu.
 
J'ai créé une fonction pour afficher le contenu des classes parents/filles etc...  
et en fait ca m'affiche qu'un objet sur 2. Et d'apres mes test, c'est pas la fonction d'affichage qui merde, mais apparament il n'enregistre que 1 objet sur 2. Pour une raison que j'ai beau chercher je ne trouve pas.
 
Voila ce que ca donne en appelant AfficherArbre() comme ceci :  
 

Code :
  1. <?php
  2.     $test=new TypeDroit();
  3.     $test->AfficheArbre();
  4. ?>


 
 
Ca donne ceci a l'écran :  
 

Racine-->
        gestion_membres-->
                insert-->
                list-->
                abonnements-->
                        paiements-->
                                list-->
                                insert-->
                        list-->
                        delete-->
                update-->
        gestion_configuration-->
        gestion_cours-->
                types_abonnements-->
                        delete-->
                        insert-->
                horaire-->
                delete-->
                update-->
                list-->


 
Ca parrait bon mais ca ne l'est pas car il manque un objet sur 2. On devrait voir ceci :  
 

Racine-->
        gestion_membres-->
                insert-->
                list-->
                abonnements-->
                        paiements-->
                                list-->
                                insert-->
                                delete-->
                        list-->
                        delete-->
                        insert-->
                update-->
                delete-->
        gestion_configuration-->
        gestion_cours-->
                types_abonnements-->
                        delete-->
                        insert-->
                        update-->
                horaire-->
                delete-->
                update-->
                list-->
                insert-->
        gestion_stocks-->
                achats-->
                        cancel_order-->
                        mark_as_received-->
                        mark_as_paid-->
                        order-->
                fournisseurs-->
                        list-->
                        delete-->
                        update-->
                        insert-->


 
Ce qu'il y a c'est que ce qui est affiché ci-dessus (l'affichage correct) je parviens a l'obtenir, en décommentant la ligne n° 35 et en commentant la ligne 58 ! Ce qui est absolument absurde à mes yeux! J'ai beau chercher l'erreur. Je trouve pas :(
 
Aidez moi svp !!  :cry:  
 
Merci d'avance


Message édité par Gat$ le 14-05-2005 à 18:54:15
Reply

Marsh Posté le 14-05-2005 à 18:38:52   

Reply

Marsh Posté le 14-05-2005 à 18:44:22    

Heu non je suis un boulet !!!!!! Je viens de  trouver, j'ai mis :
 
for($i=0; $i<count($this->fils)-1; $i++) {
 
a la place de  
 
for($i=0; $i<count($this->fils); $i++) {
 
pour une raison obscure  :whistle:  
 
Bon je vais me flageller.
 
merci quand meme  [:gat$]


Message édité par Gat$ le 14-05-2005 à 18:44:59
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed