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 :

Se promener dans une arborescence récursive et la modifier


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut Se promener dans une arborescence récursive et la modifier
    Bonjour,

    J'ai eu besoin pour une appli de développer un système permettant d'avoir une arborescence récursive, ce qui fut fait. Mon arbo est donc maintenant composée de divers objets s'imbriquant les uns dans les autres, et dispose de tout un tas de méthodes fort pratiques pour me deplacer dedans et en faire un rendu HTML selon mes besoins. Tout cela fonctionne, et c'est fort bien .

    Maintenant, je me rends compte que, contrairement à ce que j'ai fait jusqu'à présent, je vais avoir véritablement besoin de modifier ce gros objet à la volée, et donc trouver et modifier certains points de mon arborescence sans tout recréer à chaque fois. Pour info, j'ai déjà un système de coordonnées me permettant de me renvoyer une branche précise, mais en copie, et que je ne peux donc que lire ... Mes coordonnées sont de la forme racine|x|x|x et permettent de se déplacer dans des tableaux en partant de la racine. Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Racine 
     - propriétés
     - enfants
       - [x] branche x
         - propriétés
           - enfants [...]
       - [x+1] branche x+1 [...]
    Pour l'instant, je fais donc (dans une méthode dédiée) :

    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
     
    			foreach ($coordonnees AS $position) {
    				if ($position == 'racine') {
    					//On récupère l'objet de base
    					$Racine = $this->racine;
    				}
    				else {
    					//On copie la branche dans une variable
    					$Branche = $Racine->enfants[$position];
    					if (get_class($Branche) == 'Branche') {
    						if ($Branche->noeud == true) {
    							//On remplace $Racine pour le prochain passage de la boucle
    							$Racine = $Branche->enfants;
    						}
    					}
     
    				}
    			}
    J'ai volontairement simplifié, mais c'est le concept. Un foreach me permet de descendre à chaque fois, mais évidemment je suis obligé d'écraser mon objet original pour la boucle suivante ...

    Je suis ouvert à toute proposition/idée concernant ce souci


    Merci d'avance !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut
    Bon, vu le peu de réactions, c'est peut-être que je devrais reformuler un peu ma question.

    En fait, ce que je voudrais vraiment, c'est arriver à faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $position = '->enfants->branche[x]'
    ${'Racine'.$position}
    La évidemment, plus de problème, puisque construire des variables, je sais faire

  3. #3
    Membre Expert Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Par défaut
    Bonjour,

    une idée comme ca, tu peux utiliser les références.
    Par exemple la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Racine = $Branche->enfants;
    tu la transforme en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Racine = &$Branche->enfants;
    Comme ca quand tu modifie $Racine, cela modifie également $Branche->enfants

    Ou une autre idée, tu utilises une fonction récursive, toujours en passant la boucle concerné par référence. Ainsi toutes modifications faites dans la fonction sont repercutées sur ton objet initial.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut
    Salut

    En fait, je m'étais déjà pas mal battu avec des esperluettes pour essayer de faire ce que tu dis, mais sans succès.

    Ce matin j'ai finalement trouvé la solution que je cherchais : eval().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Pas bon
    ${'Racine'.$position}
     
    //Bon
    eval('$Racine'.$position.';');
    Et comme PHP me renvoie les objets par référence, je peux directement utiliser ma méthode pour aller modifier des attributs comme j'en ai envie. Elle est pas belle la vie ?

Discussions similaires

  1. Positionnement dans une arborescence en Excel VBA
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/11/2005, 20h10
  2. Récursivité dans une arborescence de dossiers...
    Par thony23 dans le forum Langage
    Réponses: 5
    Dernier message: 26/10/2005, 17h14
  3. Repérer un dossier dans une arborescence
    Par Feustine dans le forum Langage
    Réponses: 2
    Dernier message: 11/08/2005, 14h54
  4. Pb d'Ajout un noeud fils dans une arborescence
    Par oramine dans le forum Oracle
    Réponses: 5
    Dernier message: 21/12/2004, 16h39
  5. Suppression d'item dans une arborescence
    Par jonzuzu dans le forum MFC
    Réponses: 2
    Dernier message: 24/02/2004, 18h45

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