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. #21
    Invité
    Invité(e)
    Par défaut
    Oui oui, j'ai fais sur feuille d'abord et après j'ai regardé en mettant des echo qui disait différentes choses voir si je passais bien dans l'ordre qu'il fallait, et c'était ok !!

    Mais j'ai vraiment trop l'impression que rien n'est enregistré dans $tabFacture, et quand je regarde l'algo ca me parait logique en plus que rien ne soit enregistré dedans. Parce qu'on dit que le résultat est toujours mis dans $tableauParent, donc cette variable va contenir le tableau (au début elle va pointer sur $tabFacture non ?), mais est-ce qu'en modifiant ce tableau, on modifie tabFacture ?? J'suis pas sûre et je recommence à m'embrouiller

  2. #22
    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
    Oui oui, j'ai fais sur feuille d'abord et après j'ai regardé en mettant des echo qui disait différentes choses voir si je passais bien dans l'ordre qu'il fallait, et c'était ok !!

    Mais j'ai vraiment trop l'impression que rien n'est enregistré dans $tabFacture, et quand je regarde l'algo ca me parait logique en plus que rien ne soit enregistré dedans. Parce qu'on dit que le résultat est toujours mis dans $tableauParent, donc cette variable va contenir le tableau (au début elle va pointer sur $tabFacture non ?), mais est-ce qu'en modifiant ce tableau, on modifie tabFacture ?? J'suis pas sûre et je recommence à m'embrouiller
    OK si tu as un doute essaie en passant tes paramètres tableaux par référence. Tu as raison c'est peut-être ça. Je sais plus si en PHP les tableaux sont passés par défaut par valeur ou par référence...

  3. #23
    Invité
    Invité(e)
    Par défaut
    Oups, faut je retrouve comment on fais ça Je sais même plus si ça m'est déjà arrivé de le faire en PHP

    EDIT :
    J'ai trouvé ça : http://www.developpez.net/forums/showthread.php?t=34931
    Le problème c'est que quand je n'ai pas de titre parent, ça plante en me disant que le premier argument doit-être un tableau pour la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_push($tableauParent,array("nom"=>$reperes[$i]['designation'], "qte"=>$reperes[$i]['qteCommandee'], "PUHT"=>$reperes[$i]['prixUnitaireHT']));
    EDIT 2 : j'ai essayé avec une autre méthode pour le passage en référence (le &), mais ça ne donne rien, rien ne change
    Dernière modification par Invité ; 02/10/2006 à 11h50.

  4. #24
    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 essayé avec une autre méthode pour le passage en référence (le &), mais ça ne donne rien, rien ne change
    Oui il faut mettre un & dans la déclaration de ta fonction (pas à l'appel, à la déclaration)

    Que vaut $tableauParent lorsqu'il y a une erreur ?
    Tu as bien initialisé $tabFacture à array() au début de ton code ?

  5. #25
    Invité
    Invité(e)
    Par défaut
    Oui il faut mettre un & dans la déclaration de ta fonction (pas à l'appel, à la déclaration)
    Ca ne change strictement rien

    Tu as bien initialisé $tabFacture à array() au début de ton code ?
    Oui parfaitement.

    Que vaut $tableauParent lorsqu'il y a une erreur ?
    Il n'y a aucune erreur

    Je passe dans les bonnes boucles, il me remplit bien les choses normalement puisqu'à chaque fois que je fais un affichage de la dernière case qu'il remplit, j'ai les bonnes choses dedans. Par contre tabFacture reste à vide. Je commence à me tirer les cheveux

    Je comprend vraiment pas ce qu'il y a qui va pas

    EDIT :
    pour l'erreur à propos de $tabParent, tu parlais en utilisant la technique du lien que j'ai trouvé ?? Si oui, alors $tabParent vaut : ArrayObject Object ( )

  6. #26
    Invité
    Invité(e)
    Par défaut
    Je crois que je vais devenir dingue
    Mais si c'est pas un problème de passage par valeur ou par paramètre qu'est-ce-que c'est ??
    Enfin vu que le passage de paramètre ne change rien, je me demande si je le fais bien !!

  7. #27
    Invité
    Invité(e)
    Par défaut
    Sinon, on m'a proposé une solution que je trouve pas très propre m'enfin, je me tire tellement les cheveux que pourquoi pas !!
    C'est de ne pas faire de distinction entre un vrai repère et un simple titre de présentation dans la facture, donc de regrouper les deux tables (ce que je trouve vraiment pas top), avec un numéro d'ordre, ce qui donnera comme type d'enregistrement :

    Nom | quantité | prix | ordre
    Titre 1 | null | null | 1
    Repere 1 | 180 | 79,2 | 2
    Titre 2 | null | null | 3
    Sous-titre 1 | null | null | 4
    Repere 2 | 180 | 79,2 | 5

    Ce qui donnerait
    Titre 1
    --> Repere 1
    Titre 2
    -->Sous-titre 1
    -->-->Repere 2

    Ce que je trouve pas super génial, de totue maniète, un article n'est pas un titre de facture !! Donc pour moi c'est des tables séparés, mais là comme je coince trop avec mon algo (ça fait déjà presque 2 semaines), je me dis que je vais peut-être finalement optée pour cette solution


    EDIT :

    Personne ne voit pourquoi mon tableau reste vide svp ??
    Dernière modification par Invité ; 02/10/2006 à 16h59.

  8. #28
    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
    J'ai trouvé.
    Tu me donnes combien pour la réponse ?

  9. #29
    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
    Bon, le problème réside dans cette histoire de passage par référence. On a passé les arguments de notre fonction récursive par référence, c'est bien et c'est nécessaire. Seulement comme c'est récursif, les arguments de l'un sont les sorties de l'autre, et les sorties aussi sont transmises par copie... Il faut les passer aussi par référence. Deux manips à faire : rajouter un "&" devant le nom de la fonction dans la déclaration, et lors de chaque appel, changer l'opérateur d'affectation du retour "=" par "=&".

    Tu devrais arriver à nettoyer ton code dans son état actuel, mais en cas de souci, j'ai fait la manip chez moi et ça marche. Je joins la structure de ma base de données, le code PHP et la sortie.

    Tu peux te vanter de m'avoir pourri le moral pendant mon week-end, ça m'énervait de pas arriver à écrire proprement cette *** de fonction récursive... Mais chuis rancunier et j'aime pas perdre contre un ordinateur

    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
    -- phpMyAdmin SQL Dump
    -- version 2.8.1
    -- http://www.phpmyadmin.net
    -- 
    -- Serveur: localhost
    -- Généré le : Lundi 02 Octobre 2006 à 19:01
    -- Version du serveur: 5.0.22
    -- Version de PHP: 5.1.4
    -- 
    -- Base de données: `facture`
    -- 
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `groupes`
    -- 
     
    CREATE TABLE `groupes` (
      `idgroupe` bigint(20) unsigned NOT NULL auto_increment,
      `parent` bigint(20) default NULL,
      PRIMARY KEY  (`idgroupe`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
     
    -- 
    -- Contenu de la table `groupes`
    -- 
     
    INSERT INTO `groupes` (`idgroupe`, `parent`) VALUES (1, NULL),
    (2, NULL),
    (3, 2),
    (4, 3),
    (5, 2);
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `reperes`
    -- 
     
    CREATE TABLE `reperes` (
      `id` bigint(20) unsigned NOT NULL auto_increment,
      `parent` bigint(20) default NULL,
      `atraiter` tinyint(1) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
     
    -- 
    -- Contenu de la table `reperes`
    -- 
     
    INSERT INTO `reperes` (`id`, `parent`, `atraiter`) VALUES (1, NULL, 1),
    (2, NULL, 1),
    (3, 1, 1),
    (4, 2, 1),
    (5, 3, 1),
    (6, 4, 1),
    (7, 5, 1);
    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
    <?php
     
    function printr ( $object , $name = '' ) {
       if ( is_array ( $object ) ) {
           print ( '<pre>' )  ;
           print_r ( $object ) ;
           print ( '</pre>' ) ;
       } else {
           var_dump ( $object ) ;
       }
     
    }
     
    	// Fonction récursive
    function &traiterParent($noeud, &$tableau) {
    	if (!isset($noeud->parent)) {
    		return $tableau;
    	}
    	else {
    		mysql_connect("localhost", "facture", "facture");	
    		mysql_select_db("facture") or die(mysql_error());	
    		$query = "SELECT * FROM `groupes` WHERE `idgroupe`='".$noeud->parent."'";
    		$result = mysql_query($query) or die($query . " - " . mysql_error());
    		if (mysql_num_rows($result) != 1) {
    			die("Base de données inconsistante. Pendez le développeur par les tripes.");
    		}
    		$parent = mysql_fetch_object($result);
    		$tableauParent =& traiterParent($parent, &$tableau);
    		if (!isset($tableauParent[$parent->idgroupe])) {
    			$tableauParent[$parent->idgroupe] = array();
    		}
    		return $tableauParent[$parent->idgroupe];
    	}
    }
     
    	// Récupération des repères à traiter, on les met dans le tableau $listeReperes
    	mysql_connect("localhost", "facture", "facture");	
    	mysql_select_db("facture") or die(mysql_error());	
    	$query = "SELECT * FROM `reperes` WHERE `atraiter`='1'";	
    	$result = mysql_query($query) or die($query . " - " . mysql_error());	
    	$listeReperes = array();
    	while ($repere = mysql_fetch_object($result)) {
    		array_push($listeReperes, $repere);
    	}	
    	mysql_close();
     
    	// Création de $tabFacture
    	$tabFacture = array();
     
    	// Boucle principale
    	foreach($listeReperes as $repere) {
    		$tableauParent =& traiterParent($repere, $tabFacture);
    		$tableauParent["rep" . $repere->id] = $repere;
    	}
     
    	// Affichage du résultat
    	printr($tabFacture);
    ?>
    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
    Array
    (
        [rep1] => stdClass Object
            (
                [id] => 1
                [parent] => 
                [atraiter] => 1
            )
     
        [rep2] => stdClass Object
            (
                [id] => 2
                [parent] => 
                [atraiter] => 1
            )
     
        [1] => Array
            (
                [rep3] => stdClass Object
                    (
                        [id] => 3
                        [parent] => 1
                        [atraiter] => 1
                    )
     
            )
     
        [2] => Array
            (
                [rep4] => stdClass Object
                    (
                        [id] => 4
                        [parent] => 2
                        [atraiter] => 1
                    )
     
                [3] => Array
                    (
                        [rep5] => stdClass Object
                            (
                                [id] => 5
                                [parent] => 3
                                [atraiter] => 1
                            )
     
                        [4] => Array
                            (
                                [rep6] => stdClass Object
                                    (
                                        [id] => 6
                                        [parent] => 4
                                        [atraiter] => 1
                                    )
     
                            )
     
                    )
     
                [5] => Array
                    (
                        [rep7] => stdClass Object
                            (
                                [id] => 7
                                [parent] => 5
                                [atraiter] => 1
                            )
     
                    )
     
            )
     
    )

  10. #30
    Invité
    Invité(e)
    Par défaut
    olalalalala

    Je pourrais tester ça que demain, mais si c'est ça, alors je suis amoureuse de toi mdr

    En tout cas merci beaucoup d'avoir chercher, je devenais dingue, et désolée pour ton we !! jte ferais bien un bisous pour te consoler mais bon lol

  11. #31
    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
    olalalalala

    Je pourrais tester ça que demain, mais si c'est ça, alors je suis amoureuse de toi mdr

    En tout cas merci beaucoup d'avoir chercher, je devenais dingue, et désolée pour ton we !! jte ferais bien un bisous pour te consoler mais bon lol
    Qui a dit que l'informatique c'était pas un bon plan drague ?

  12. #32
    Invité
    Invité(e)
    Par défaut


    Bon ça a l'air de marche tu as raison, mais comme j'arrive pas à afficher le tableau, j'peux pas dire que ça marche à coup sûr mais je te fais confiance.
    Peut-être que j'aurais du faire de l'objet ... Faudrait que je m'y mette quand même lol

    Bon ben j'ai plus qu'à faire un truc qui affiche récursivement on dirait (ben c'est pas gagné vu comment je suis douée avec mes trucs récursifs )

    EDIT : je crois que je sais pourquoi j'arrive pas à afficher, c'est parfait pour des repères sans titre, mais pour les repères avec titre, je ne trouve que l'indice "titre", mais rien dedans, donc il sont pas sauvegardés dans le tableau

    Surement que ça vient de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_push($tableauParent,array("nom"=>$reperes[$i]['designation'], "qte"=>$reperes[$i]['qteCommandee'], "PUHT"=>$reperes[$i]['prixUnitaireHT']));
    Grrrr vais me prendra la tete dessus

    J'ai la poisse, à part cette ligne, c'est pas vraiment différent de toi, mais j'enregistre rien dans les sous-titres

    EDIT 2 :
    Même en mettant la même ligne que toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tableauParent["rep".$reperes[$i]['idRepere']] = $reperes[$i];
    Rien n'est enregistré dans le titre
    Par contre si je met explicitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tabFacture["titre 1"]["rep".$reperes[$i]['idRepere']] = $reperes[$i];
    Là ça marche ...
    Dernière modification par Invité ; 03/10/2006 à 09h43.

  13. #33
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Désolé d'intervenir dans votre flirt ^^, mais j'ai deux petites questions :
    Est-ce que les groupes sont communs à toutes les factures ?
    Combien y a t il de groupes/sous-groupes au total [select count(*) from groupes] ?

  14. #34
    Invité
    Invité(e)
    Par défaut


    Alors les groupes ne sont pas communs aux factures, en fait ce qu'on appelle groupe ici, ce sont les titres qui regrouperont des articles sur la facture (ici des fenêtres), donc dans la facture tu auras quelque chose comme :
    Villa A
    -->repere 1
    Villa B
    -->Appartement 1
    -->-->repere2
    -->-->repere 3

    Etc etc (c'est un exemple hein).Mais il peut y avoir plusieurs factures pour une même commande (par exemple une facture par livraison) où là les groupes seront communs à toutes les factures de cette commande.

    Sinon, on ne peux jamais savoir à l'avance combien il va y avoir de titres/sous-titres, ça dépend des factures.

    Mais moi là, j'ai un titre, mais rien dedans Le pire, c'est que Eusebius m'a fais le code et je trouve pas l'erreur J'ai la poisse c'est sûr !

  15. #35
    Invité
    Invité(e)
    Par défaut
    Bon c'est grave là !!!!

    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
     
     
    function &traiteParent($unTitre,&$tabFinal)
    {
    	if($unTitre=='')
    	{
    		echo 'Pas de parent en envoi dans la fonction.<br />';
    		return($tabFinal);
    	}
    	else
    	{
    		$titreParent = SQL_SELECT("SELECT * FROM devis_groupeRepere WHERE idGroupe='".$unTitre."';");
    		if(count($titreParent)==1)
    		{
    			echo 'Pas de parent dans la récupération des infos du parent enregistré.<br />';
    			return($tabFinal);
    		}
    		else
    		{
    			echo 'un parent trouvé !<br />';
    			$tableauParent =& traiteParent($titreParent['idGpeParent'], &$tabFinal);
    			if(!isset($tableauParent[$titreParent['nomGroupe']]))
    			{
    				$tableauParent[$titreParent['nomGroupe']] = array();
    			}
    			echo $titreParent['nomGroupe'].'<br />';
    			return($tableauParent[$titreParent['nomGroupe']]);
    		}
    	}
    }
     
    for($i=1 ; $i<$nbReperes ; $i++)
    {
    	$tableauParent =& traiteParent($reperes[$i]['idGroupe'], $tabFacture);
    	$tableauParent["rep".$reperes[$i]['idRepere']] = $reperes[$i];
    }
    Mais qu'est-ce qu'il y a de si différent avec ton code pour que je n'enregistre rien dans mon tableau pour les indice des titres ??? Je parie que y'a un truc tout con, et que je le vois même pas !! Je retourne le truc dans tous les sens, ça fait une dizaine de fois que je compare mon code et le tiens, et je trouve pas !

  16. #36
    Invité
    Invité(e)
    Par défaut
    J'ai trouvé mais là je suis sur le Q !!

    Je voudrais bien qu'on m'explique ce phénomène que je trouve étrange !!!

    Le problème venait de : return ($tableauParent[$titreParent['nomGroupe']]);

    Il ne faut pas de paranthèse. En effet, après avoir reregardé ton code, j'ai vu que t'en avais pas mis (même si dans ma tête les parenthèses ne sont censées rien changer sauf niveau performance un truc dans le genre), ben je me suis dis "allez t'es plus à ça près". Hop je change et ça marche !! Là je suis choquée

    Comment ça se fait ????

  17. #37
    Invité
    Invité(e)
    Par défaut
    Bon c'est pas grave pour l'explication, je saurais peut-être une autre fois

    Allez, c'est résolu, merci beaucoup pour l'aide (génial Eusebius, tu m'as trop trop aidé )

  18. #38
    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 c'est pas grave pour l'explication, je saurais peut-être une autre fois
    J'ai pas de réponse dsl.

  19. #39
    Invité
    Invité(e)
    Par défaut
    C'est pas grave, ça marche c'est déjà trop niquel

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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