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] Problème algo récursif


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut [Tableaux] Problème algo récursif
    Bonjour,

    Je viens demander un petit peu d'aide parce que plus je réfléchis et plus je m'enfonce

    J'ai une table groupeRepere et une table repere.
    La table repere contient la liste des repères (produits) d'une facture, et contient des informations comme lea désignation, le prix, la quantité commandée et l'identifiant d'un groupe de la table groupeRepere (il se peut qu'un repère n'ait pas de groupe).
    La table groupeRepere contient le nom du groupe et l'identifiant du groupe auquel il peut appartenir (puisqu'on peut avoir des sous-groupes).

    Maintenant, il faut qu'à partir des repères de la facture, je reconstitue le listing des repères avec leur sous-groupes et groupes, par exemple :

    Groupe 1
    Sous-Groupe 1
    Repère 1
    Repère 2
    Repère 3
    Groupe 2
    ......

    Je me suis dis que j'allais faire un tableau pour représenter cette liste, ce qui donnerait peut-être quelque chose du genre :
    tab[groupe1][sous-groupe1][repere1] = array(quantité,prix)
    tab[repere3] = array(quantité,prix)
    Mais je n'y arrive pas, tous les algo que j'essaye de faire, ne marchent jamais entièrement (il y a toujours quelque chose qui cloche) et je crois que je tourne un peu en rond. Peut-être que mon idée (de tableau) n'était pas bonne.

    Voilà, j'espère avoir été assez claire. Merci

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    L'idée du tableau semble appropriée. Fais voir ton algo le plus au point !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ola d'accord, mais va falloir être patient parce que ça ressemble plus à grand chose (d'ailleurs y'en a tellement, je sais plus lequel c'est )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var tab;
    var dernierIndice;
    
    fonction recupCorpsFacture(elt)
    {
    
    //On recherche par une requête SQL si l'elt en cours a un titre parent
    Si elt a un titre alors
    recupCorpsFacture(titre);
    tab[dernierIndice][elt]=elt;
    Sinon
    dernierIndice = elt;
    Fin Si
    }
    Bon en fait je me poses trop de questions, donc je sais plus dans quel sens tourner les choses ...
    Dans la première condition, je m'étais dis que je testerais si l'élément en cours est un repere ou un titre pour faire un truc dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Si elt est un titre alors
    tab[dernierIndice][titre]=array();
    Sinon
    tab[dernierIndice][nomRepere]=array(prix,quantite);
    Le problème est que je sais plus jouer avec les indices là Par exemple pour la ligne ci-dessus en rouge, faut pas que le repèresoit dans le plus "haut" titre, mais dans son premier titre parent. Or, comme je fais c'est pas le cas.

    En plus, j'ai un autre problème qui est le fait qu'il peut y avoir plusieurs repères avec le même nom (donc pour les indices du tableau c'est pas super).
    --> Donc là je me suis dis qu'au lieu de stocker le nom des repères je remplis le tableau par push (on s'en fiche à ce niveau del 'index, parce qu'on a plus besoin de faire un tableau par derrière, je sais pas si vous suivez).

    BOn j'ai un peu de mal à m'expliquer là, mais j'espère vous comprendez. Soit je cherche à faire trop compliqué, soit je suis carrément hors sujet, parce que je tourne. Je vois ce que je veux faire, et comment faudrais que ça marche, mais j'y arrive pas

  4. #4
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par poopsinou
    BOn j'ai un peu de mal à m'expliquer là, mais j'espère vous comprendez.
    Pas trop, mais bon il est encore tôt du matin... Et si tu nous donnais ton code PHP, en nous disant ce qui ne fonctionne pas comme tu veux ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ah désolée ...

    Avant de mêtre lancée dans le code PHP pour me rendre compte que ça partirait dans tous les sens et que je ferais n'importe quoi, je me suis dis que pour une fois, j'allais d'abord poser tout ça sur papier !
    Et comme tu vois, sur le papier ça donne pas grand chose, alors en PHP je crains le pire

    En fait :
    - pour chaque repère, il faut chercher son titre (s'il existe)
    --> Si le titre existe, alors on recherche le titre du titre, et ainsi de suite
    --> Quand le dernier titre trouvé (en remontant comme ça) n'a pas de titre parent, alors on le stocke en tant qu'index du tableau, et à cet index, on aura ses titres fils, qui eux-même contiendront leurs titres-fils, et ainsi de suite jusqu'au repère qui a généré tout ça (en gros on remonte, pour finalement tout redescendre en stockant dans un tableau)
    --> Sinon on stocke le repère dans le tableau final

    Donc voilà, pour moi je pense ça devrait marche comme ça (je sais pas ce que vous en pensez), mais j'arrive pas à la mettre sur papier (et donc encore moins à le coder), je vois pas comment constituer le tableau final

  6. #6
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Et si tu basais ton algo sur la réalité de ta représentation des données ?
    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
    créer le tableau $tab
     
    appeler remplirReperes($tab, null)
     
    chercher tous les groupes qui n'ont pas de groupe parent, les mettre dans listeGroupes
    pour tout groupe gp dans listeGroupes, faire :  
      appeler traiter(gp, $tab[gp])
    fin pour tout
     
    procedure remplirReperes($tableau, parent)
      chercher tous les repères ayant parent comme groupe, les mettre dans listeReperes
      pour chaque repère rep dans listeReperes, faire :
        créer une entrée $tableau[rep]
      fin faire
    fin procedure
     
    procedure traiter(groupe, $tableau)
      créer une entrée dans le tableau avec le nom du groupe ($tableau[groupe])
      appeler remplirReperes($tableau[groupe], groupe)
      chercher tous les groupes fils, les mettre dans listeFils
      pour chaque groupe "fils" dans listeFils, faire :
        appeler traiter(groupe, $tableau[groupe])
      fin faire
    fin procedure
    J'espère ne pas avoir fait de bourde, je suis pas top réveillé. Tu adapteras.

    Je trouve qu'il y a un souci dans cette représentation en tableau quand même, on ne différencie pas forcément un indice "repère" d'un indice "groupe".

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je dois impérativement partir des repères et pas des titres !!! Parce que j'ai une table qui va stocker tous les titres existants pour toutes les factures ! Or, moi je ne veux que les titres associés au repères d'une facture X. Donc autant partir des repères et récupérer les titres correspondants (ça évite de traiter des trucs pour rien).

    C'est pour ça que c'est si compliqué dans ma tête, dans l'autre sens, ça serait plus simple c'est sûr !

    Ca commence à me rendre légèrement stressée

    Et pourquoi distinguer un indice groupe d'un indice repère ??? Puisque il me faut tableau tab[titre1][sous-titre][repere1] dans ce style pour afficher à l'écran un tableau donc la première colonne sera :
    TITRE 1
    Sous-titre
    repere1
    ...

    Et comment je pourrais faire la distinction d'ailleurs ? Mon tableau ressemblerait à quoi au final ?? Un truc du genre : tableau[Titre1][sous-titre] = array([0] => array(repere,quantite,prix), [1] => array(repere,quantite,prix)) ??

  8. #8
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par poopsinou
    Je dois impérativement partir des repères et pas des titres !!! Parce que j'ai une table qui va stocker tous les titres existants pour toutes les factures ! Or, moi je ne veux que les titres associés au repères d'une facture X. Donc autant partir des repères et récupérer les titres correspondants (ça évite de traiter des trucs pour rien).
    OK, maintenant j'ai compris ce que tu voulais... Une autre tentative :

    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
    précondition : la liste des repères est dans listeRepères
    créer le tableau $tab
     
    pour tout repère rp dans listeRepères faire :
      $tableauParent = traiterParent(rp, $tab)
      créer  $tableauParent[rp] // chaîne qui va bien à la place de rp
    fin faire
     
    fonction traiterParent(objet, $tableau)
      si objet n'a pas de parent
        renvoyer $tableau
      sinon
        récupérer parent le parent de objet
        $tableauParent = traiterParent(parent, $tableau)
        créer $tableauParent[parent] // chaîne qui va bien à la place de parent
        renvoyer $tableauParent[parent]
      fin si
    fin fonction
    En espérant encore une fois n'avoir pas fait d'erreur

    Citation Envoyé par poopsinou
    Et pourquoi distinguer un indice groupe d'un indice repère ?
    Si ça te pose pas de problème, ya pas de raison que ça m'en pose.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ola, ça a l'air pas mal du tout ça Je vais essayer de le mettre en place, voir si ça marche bien !! Et je te tiens au courant

    En tout cas, merci de t'être penché sur mon algo

  10. #10
    Invité
    Invité(e)
    Par défaut
    J'ai du avoir un moment de lucidité parce que là je comprend plus certaines trucs ...

    Qu'entends-tu par créer $tableauParent[parent] ?? dans la fonction traiterParent

    Merci !

  11. #11
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par poopsinou
    J'ai du avoir un moment de lucidité parce que là je comprend plus certaines trucs ...

    Qu'entends-tu par créer $tableauParent[parent] ?? dans la fonction traiterParent

    Merci !
    "parent", ça va être un groupe, un sous-groupe... admettons qu'il ait pour nom "nomGroupe".
    par la création de ce machin j'entends par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tableauParent["nomGroupe"] = array();

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bon on reprend parce que y'a des trucs qui m'échappent désolée.


    précondition : la liste des repères est dans listeRepères
    créer le tableau $tab

    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
    pour tout repère rp dans listeRepères faire :
      $tableauParent = traiterParent(rp, $tab)
      créer  $tableauParent[rp] // chaîne qui va bien à la place de rp
    fin faire
    
    fonction traiterParent(objet, $tableau)
      si objet n'a pas de parent
        renvoyer $tableau
      sinon
        récupérer parent le parent de objet
        $tableauParent = traiterParent(parent, $tableau)
        créer $tableauParent[parent] // chaîne qui va bien à la place de parent
        renvoyer $tableauParent[parent]
      fin si
    fin fonction
    En rouge j'ai mis les lignes qui me chiffonnent.
    Pour la première, je suppose que c'est là ou je met le prix et la quantité ??
    Pour la deuxième, quand je vais arriver au plus "haut" titre, il va me renvoyer le tableau, mais le plus haut titre ne sera pas stocké ... non ?

    Merci

    EDIT : j'ai essayé d'avancer, mais ça ne marche pas, mais je sais d'où ça vient.

    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
    function traiteParent($unTitre,$tabFinal)
    	{
    		$titreParent = SQL_SELECT("SELECT * FROM devis_groupeRepere WHERE idGroupe='".$unTitre."';");
    		if(count($titreParent)==1)
    		{
    			$tabFinal[$unTitre] = array();//Je crée la case pour le titre le plus haut
    			return($$tabFinal[$unTitre]);
    		}
    		else
    		{
    			$tableauParent = traiteParent($titreParent['idGpeParent'], $tabFinal);
    			$tableauParent[$titreParent['idGpeParent']] = array();
    			return($tableauParent[$titreParent['idGpeParent']]);
    		}
    	}
    
    
    $tabFacture = array();
    for($i=1 ; $i<$nbReperes ; $i++)
    {
    	if($reperes[$i]['idGroupe']!='')
    	{
    		$tableauParent = traiteParent($reperes[$i]['idGroupe'], $tabFacture);
    	}
    	else
    	{
    		$tableauParent = $tabFacture;
    	}
    							array_push($tableauParent,array("nom"=>$reperes[$i]['designation'], "qte"=>$reperes[$i]['qteCommandee'], "PUHT"=>$reperes[$i]['prixUnitaireHT']));//Je stocke le nom du repère (pas en indice à cause des doublons), et les autres infos
    $tabFacture = $tableauParent;
    print_r($tabFacture);echo '<br />';
    }
    Je pense que la ligne rouge cloche, en effet dans ton algo, à aucun moment, tu dis qu'il faut remettr le tableau qu'on génère dans le tableau de départ. C'est ce que j'essaye de faire, mais comme le dernier $tableauParent retourné est de la forme $tableauParent[indice], et bien je prend toujours ce qu'il y a dans $tableaParent[indice], et pas le tableau en entier.
    Dernière modification par Invité ; 29/09/2006 à 14h44.

  13. #13
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par poopsinou
    Pour la première, je suppose que c'est là ou je met le prix et la quantité ??
    Beeen... tu mets bien ce que tu veux dedans, après

    Citation Envoyé par poopsinou
    Pour la deuxième, quand je vais arriver au plus "haut" titre, il va me renvoyer le tableau, mais le plus haut titre ne sera pas stocké ... non ?
    Normalement si (j'ai pas le temps de tout reprendre dsl)

    Citation Envoyé par poopsinou
    dans ton algo, à aucun moment, tu dis qu'il faut remettr le tableau qu'on génère dans le tableau de départ.
    Si, puisqu'au bout des appels récursifs la fonction renverra $tableau.

    Désolé pas le temps de reprendre ton code avant la semaine prochaine. Je ne dis pas qu'il n'y a pas d'erreurs dans l'algo non plus, hein... Mais je sais pas, essaie de le faire à la main sur un exemple simple, pour voir s'il marche...

  14. #14
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse Pas grave si tu peux pas te plonger à fond dessus !!
    Je réessaierai lundi, parce que quand j'ai essayé ça n'a pas marché, mais je crois peut-être savoir pourquoi ...

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bon alors j'ai repris l'algo :
    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
    function traiteParent($unTitre,$tabFinal)
    {
    	if($unTitre=='')
    	{
    		return($tabFinal);
    	}
    	else
    	{
    		$titreParent = SQL_SELECT("SELECT * FROM devis_groupeRepere WHERE idGroupe='".$unTitre."';");
    		if(count($titreParent)==1)
    		{
    			return($tabFinal);
    		}
    		else
    		{
    			$tableauParent = traiteParent($titreParent['idGpeParent'], $tabFinal);
    			if(!isset($tableauParent[$titreParent['nomGroupe']]))
    			{
    				$tableauParent[$titreParent['nomGroupe']] = array();
    			}
    			return($tableauParent[$titreParent['nomGroupe']]);
    		}
    	}
    }	
    
    
    for($i=1 ; $i<$nbReperes ; $i++)
    {
    	$tableauParent = traiteParent($reperes[$i]['idGroupe'], $tabFacture);
    	array_push($tableauParent,array("nom"=>$reperes[$i]['designation'], "qte"=>$reperes[$i]['qteCommandee'], "PUHT"=>$reperes[$i]['prixUnitaireHT']));
    }
    L'identifiant du titre d'un repère est enregistré dans la table qui contient les repères, donc si un repère a son champ "idGroupe" a null, alors il n'a pas de titre parent donc le test bleu. Ensuite pour ne pas réécraser la création du tableau d'un titre, j'ai fais le test en rouge.

    Maintenant sur papier, ça a l'air de marcher, mais pas en vrai.En fait je ne comprens toujours pas comment le script peut savoir qu'à la fin $tabFacture contient tout le traitement qu'on a fais !! J'ai vérifier, je passe toujours dans les bonnes boucles etc, mais à la fin $tabFacture est égale à array(), donc à sa déclaration puisqu'à aucun moment on ne dit que $tabFacture vaut tout notre traitement non ??

  16. #16
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par poopsinou
    à aucun moment on ne dit que $tabFacture vaut tout notre traitement non ??
    Normalement tout est rajouté dans $tabFacture ou dans un de ses fils...

  17. #17
    Invité
    Invité(e)
    Par défaut
    Ben l'algo a l'air correct là non ??
    Pourtant $tabFacture est vide, quand je demande de l'afficher il me sort array() ... Moi aussi je pensais que ça rajoutais directement, mais on dirait bien que non ... La taille du tableau vaut 0 Et j'arrive pas à résoudre le problème !

  18. #18
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Je ne comprends pas cette partie-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(count($titreParent)==1)
    		{
    			return($tabFinal);
    		}
    à mon avis c'est peut-être ça le pb.

    Peux-tu aussi expliquer ce que veut dire cette expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $titreParent['idGpeParent']

    PS J'espère que ta fonction SQL_SELECT marche proprement

  19. #19
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(count($titreParent)==1)
    {
    	return($tabFinal);
    }
    Ca c'est parce que toutes les interactions avec la base de données sont faites dans une classe (que l'autre développeur a codé). En fait, les résultats de requêtes sous mis directement dans des tableaux, et quand il n'y a aucun résultat (le tableau vaut 1). Donc là ca veut dire que quand je cherche un titre parent avec la requête qui précédait ce test, et que le résultat qui est dans $titreParent a une taille de 1, alors je n'ai pas de parent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $titreParent['idGpeParent']
    Ca c'est parce qu'en fait ma table titre contient l'identifiant du titre parent si elle en a un, donc je sais directement si un titre a un parent ou non. Donc en fait j'envois l'identifiant du titre (qui vaudra une chaîne vide s'il n'a pas de parent, ou un entier) à la fonction (l'identifiant du parent quoi).

    Pour la fonction SQL_SELECT, ne t'inquiète pas, elle marche parfaitement (ça fait un moment qu'elle tourne et jamais eu de problème lol).

  20. #20
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Tu as vérifié au débuggage que tu passais dans toutes les branches de la fonction comme il faut ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Tableaux] Problème avec les boucles
    Par speed_man002 dans le forum Langage
    Réponses: 4
    Dernier message: 21/09/2005, 15h42
  2. [Tableaux] problème de concaténation
    Par ludovik dans le forum Langage
    Réponses: 3
    Dernier message: 13/09/2005, 13h24
  3. [Tableaux] problème avec while
    Par zimotep dans le forum Langage
    Réponses: 3
    Dernier message: 11/09/2005, 10h30
  4. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37
  5. problème algorithme récursif
    Par seb888 dans le forum Général Java
    Réponses: 11
    Dernier message: 04/06/2005, 21h35

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