Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1050 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Pb avec ma fonction récursive

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb avec ma fonction récursive

n°904330
ibti25
Posté le 21-11-2004 à 22:23:55  profilanswer
 

:??: 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
mood
Publicité
Posté le 21-11-2004 à 22:23:55  profilanswer
 

n°904340
deltree
Posté le 21-11-2004 à 22:34:30  profilanswer
 

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é.

n°904342
deltree
Posté le 21-11-2004 à 22:39:25  profilanswer
 

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?).

n°904353
ibti25
Posté le 21-11-2004 à 22:46:31  profilanswer
 

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.

n°904369
deltree
Posté le 21-11-2004 à 22:52:28  profilanswer
 

merci, je m'y colle juste apres

n°904384
deltree
Posté le 21-11-2004 à 23:01:25  profilanswer
 

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

n°904422
ibti25
Posté le 21-11-2004 à 23:25:26  profilanswer
 

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

n°904460
naceroth
Posté le 22-11-2004 à 02:29:44  profilanswer
 

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] ?

n°904650
deltree
Posté le 22-11-2004 à 13:40:52  profilanswer
 

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.

n°904651
ibti25
Posté le 22-11-2004 à 13:45:20  profilanswer
 

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 !!!

mood
Publicité
Posté le 22-11-2004 à 13:45:20  profilanswer
 

n°904653
ibti25
Posté le 22-11-2004 à 13:46:57  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Pb avec ma fonction récursive

 

Sujets relatifs
Rendre une fonction generalisable...Mettre une table à jour en fonction d'une autre de reference
try/catch et retour de fonctionpb avec la fonction ob_start()
Fonction mail()utilisation fonction perso sous excel
fonction exponentielle mauvais résultatune fonction pour supprimer les répétitions dans un formulaire
prob Variable et fonction moyennegros pb avec la fonction mail ... help
Plus de sujets relatifs à : Pb avec ma fonction récursive


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR