Pb avec ma fonction récursive

Pb avec ma fonction récursive - PHP - Programmation

Marsh Posté le 21-11-2004 à 22:23:55    

:??: Avant de lire mon pb ne vous effrayer de la taille du sujet. J'ai préféré expliquer en détail mon souci que donner un morceau de code.  
 
 
J'ai crée une fonction récursive qui me permet de récuperer tous les parents d'une famille donnée.
Pour cela, j'ai crée une table famille ou je stocke l'id de ma famille et l'idparent de celle-ci (s'il existe).  
Ex de ma table :
 
CREATE TABLE famille (
idfamille int(11) NOT NULL auto_increment,
idfamparent int(11) default NULL,
PRIMARY KEY (idfamille)
) TYPE=MyISAM;

 
Le contenu de ma table :
 
INSERT INTO famille VALUES (1,'');
INSERT INTO famille VALUES (2,1);
INSERT INTO famille VALUES (3,2);
INSERT INTO famille VALUES (4,3);
INSERT INTO famille VALUES (5,4);

 
Voici la fonction que j'ai développé pour récuperer les parents des parents de la famille donnée :
 
// fonction qui recupere les parents d une famille
function desc_arbo_famille($idF){
$i =0;
$tab = array();
 
$query_pF = "SELECT idfamparent as idpF";
$query_pF .= " FROM famille WHERE idfamille = $idF";
$respF = mysql_query($query_pF) or die(message_erreur("Echec de la requete sur la recuperation des parents d une famille","fonctions.php\n\n$query_pF\n\n".mysql_error()));
 
while ($linepF = mysql_fetch_array($respF)) {
      if (!empty($linepF[idpF]))
         {
          //echo "<BR>idfils :".$idF." idFparent : ".$linepF[idpF]."<BR>";
          $tab[$i] = $linepF[idpF];  
          //echo "count(tab) : ".count($tab)."<br>";
          $i++;
         }
}
 
for ($j=0;$j<count($tab);$j++)
{
      if (isFeuille($tab[$j])>0)
       {
           //echo "tabF".$j." : ".$tab[$j]."<br>";        
           $tab1 = desc_arbo_famille($tab[$j]);
       
           //echo "count(tab1) : ".count($tab)."<br>" ;
       
        for ($k=0;$k<count($tab1);$k++)
        {  
         //echo "tab".$k." : ".$tab1[$k]."<br>";            
            $tab[count($tab)] = $tab1[$k];
         }
       }
}
return $tab;
}
Et voici le code test de la fonction :
 
//appel de la fonction desc_arbo_famille avec mon idF = 4
 
$tabidF = desc_arbo_famille(4);
 
for($i=0;$i<count($tabidF);$i++){
       echo "<br>tab_".$i." : ".$tabidF[$i];
}
 
Cette fonction marche bien jusqu'à un certain niveau de sous famille c'est dire si je rentre en paramètre à ma fonction l'idF = 3 tout se passe bien cad que je recupere ds mon tableau le parent de 3 qui est 2. Le parent de 2 qui est 1. Mais au dela de 3 niveaux, la fonction bug.  
 
Par exemple, voici le contenu de mon tableau si je mets en paramètre de ma fonction l'idF = 4 :
 
//parent de 4
tab_0 : 3
//parent de 3
tab_1 : 2
//parent de 2
tab_2 : 1
//parent de 2
tab_3 : 1
 
Donc ici il me retourne 2 fois le parent de l'idF = 2.
 
Autre Exemple Pour idF = 5  
tab_0 : 4
tab_1 : 3
tab_2 : 2
tab_3 : 1
tab_4 : 1
tab_5 : 2
tab_6 : 1
tab_7 : 1
tab_8 : 1
 
Y aurait il quelqu'un qui voit mon erreur ds ma fonction ? (Je pense que ça doit etre au niveau de mes count($tab)).
 
Merci


Message édité par ibti25 le 21-11-2004 à 22:54:28
Reply

Marsh Posté le 21-11-2004 à 22:23:55   

Reply

Marsh Posté le 21-11-2004 à 22:34:30    

est ce que tu peut éditer ton message et changer la couleur JAUNE du code en une couleur plus foncée, et aussi mettre les indentations la ou il faut, c est pour une question de lisibilité.

Reply

Marsh Posté le 21-11-2004 à 22:39:25    

encore une chose:
 
pour ceci
 
CREATE TABLE famille (
idfamille int(11) NOT NULL auto_increment,
idfamparent int(11) default NULL,
PRIMARY KEY (idfamille)
) TYPE=MyISAM;
 
Le contenu de ma table :
 
INSERT INTO famille VALUES (1,'',NULL);
INSERT INTO famille VALUES (2,1,NULL);
INSERT INTO famille VALUES (3,2,NULL);
INSERT INTO famille VALUES (4,3,NULL);
INSERT INTO famille VALUES (5,4,NULL);  
 
il y a un truc qui colle pas, une colonne en trop (NULL?).

Reply

Marsh Posté le 21-11-2004 à 22:46:31    

ok, désolé pr la couleur et les indentations. je vais le changer !!
Pour la colonne en trop, c'est une erreur de moi puisque j'ai simplifié la table mais j'ai oublié d'enlever la dernière colonne.

Reply

Marsh Posté le 21-11-2004 à 22:52:28    

merci, je m'y colle juste apres

Reply

Marsh Posté le 21-11-2004 à 23:01:25    

while ($linepF =
 
c est pas ca le probleme?
j'ai pas tout lu, mais ce serait pas plutot  
while ($linepF ==
 
double =, l'erreur classique?

Reply

Marsh Posté le 21-11-2004 à 23:25:26    

Non, le problème ne vient pas du simple = car j'ai tjs fait comme ça. Mais j'ai qd meme le test et c'est pas ça.
 
C'est surement au niveau de mes for

Reply

Marsh Posté le 22-11-2004 à 02:29:44    

deltree a écrit :

while ($linepF =
 
c est pas ca le probleme?
j'ai pas tout lu, mais ce serait pas plutot  
while ($linepF ==
 
double =, l'erreur classique?


 
Sérieux, tu comprends ce que tu écris avant de répondre là ? Ou tu as juste déjà entendu ça quelque part et tu répètes ? Non, parce que dans son cas, c'est bien une affectation...
 
@ibti25
 
Je confirme, tes for sont codés avec les pieds :D
Tips technique : ne jamais utiliser comme condition d'un for une variable qui change à l'intérieur de la boucle, c'est une source d'emmerdes dès qu'on en perd le contrôle.

Code :
  1. $ltab = count($tab);
  2. for($i=0;$i<$ltab;$i++){...


sera toujours plus propre :)
 
Ah, pourquoi tu fais $tab[count($tab)] = $tab1[$k]; plutôt que $tab[] = $tab1[$k] ?

Reply

Marsh Posté le 22-11-2004 à 13:40:52    

naceroth a écrit :

Sérieux, tu comprends ce que tu écris avant de répondre là ? Ou tu as juste déjà entendu ça quelque part et tu répètes ? Non, parce que dans son cas, c'est bien une affectation...


 
T'énerve pas comme ca, j'ai juste relevé sans vraiment lire un truc qui me parraissait éronnée. Personnellement je trouve que ca peut entrainer une erreur de lecture de faire une effectation comme ca dans un while, la preuve. mais bon c'est correct.

Reply

Marsh Posté le 22-11-2004 à 13:45:20    

C'est cool la soluce de Naceroth est bonne. Merci beaucoup, je ne recommencerai plus mes for avec mes count() en condition d'arret.  
Je suis contente de ce forum, vous assurez !!!

Reply

Marsh Posté le 22-11-2004 à 13:45:20   

Reply

Marsh Posté le 22-11-2004 à 13:46:57    

naceroth a écrit :

Sérieux, tu comprends ce que tu écris avant de répondre là ? Ou tu as juste déjà entendu ça quelque part et tu répètes ? Non, parce que dans son cas, c'est bien une affectation...
 
@ibti25
 
Je confirme, tes for sont codés avec les pieds :D
Tips technique : ne jamais utiliser comme condition d'un for une variable qui change à l'intérieur de la boucle, c'est une source d'emmerdes dès qu'on en perd le contrôle.

Code :
  1. $ltab = count($tab);
  2. for($i=0;$i<$ltab;$i++){...


sera toujours plus propre :)
 
Ah, pourquoi tu fais $tab[count($tab)] = $tab1[$k]; plutôt que $tab[] = $tab1[$k] ?


 
Encore Merci, j'ai fait toute les modifs que tu as proposé, et ça marche !!!!  :pt1cable:

Reply

Sujets relatifs:

Leave a Replay

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