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 :

Algorithme récursif sur tableau [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Algorithme récursif sur tableau
    Bonjour,¨

    j'ai une structure de tableaux qui peut contenir d'autres tableaux. Je ne connais pas le nombre de niveaux de tableau de tableau de tableau, etc....

    J'ai une structure comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $conditions = array (
        'objet1' => 'valeur1',
        'objet2 => 'valeur2',
         'conditions' => array (
                     'objet1' => 'valeur',
                     'conditions' = array (
                            ......
                     )
          )
    )

    J'ai réussi à développer l'algorithme qui passe en revue tout le tableau. Evidemment, ce tableau est comparé avec d'autres valeurs. J'arrive à modifier les valeurs, mais je n'arrive pas à retourner le tableau 'conditions' (tableau principal) avec les nouvelles valeurs. Je pense qu'il est plus simple de passer le tableau 'conditions' (array_to_check) par référence. Je sais que le problème provient de ma fonction array_push($tab_index, $value['conditions']); En fait, je ne prends que le tableau enfant (à cause de l’initialisation en début de fonction), ce qui explique pourquoi je ne vois pas les valeurs modifiées dans les tableaux enfants (le changement de valeur fonctionne pour le tableau de plus haut niveau, mais seulement celui-ci. Dès qu'on atteint les enfants (['conditions']['conditions']), cela ne fonctionne plus).

    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
    function fn_check_conditions(&$array_to_check, $level, $tab_json) {
        if (!empty($array_to_check)) {
                $tab_index = array();
            foreach($array_to_check as $main_key => &$main_value) {
                    foreach ($main_value as $key => &$value) {
                        if (empty($value['conditions'])) {
                            fn_decode_data($tab_json, $value, $level);
                        } else {
                            array_push($tab_index, $value['conditions']);
                        }
                    }
            }
            $level = $level + 1;
            fn_check_conditions($tab_index, $level, $tab_json);
        }
    }
    Appel dans le main (valeur en ordre, vérifié avec xdebug)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fn_check_conditions(array($tab_native['conditions']['conditions']), 1, $tab_value_to_compare);
    Je précise que les tableaux enfants ont tous le même nom ['conditions']. Je suis obligé de travaillé avec cette structure, car le core du CMS a besoin de cette structure pour charger en base de données. Il est absolument exclu de modifier le core du CMS.

    Pouvez-vous m'aider ?
    Merci

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 898
    Points : 6 669
    Points
    6 669
    Par défaut
    Tout d'abord attention au nommage. Tu nommes une fonction fn_check_conditions (un nom qui sous-entend une simple vérification avec une valeur de retour pour savoir comment ça c'est passé), or cette fonction ne renvoie rien et est manifestement destinée à modifier le tableau qu'on lui passe. La clarté en prend tout de suite un coup.

    Je crois (après l'avoir lue 4,5 fois) que ton analyse sur le pourquoi du comment ça ne fonctionne pas est la bonne. Pour résumer $tab_index est déconnecté du tableau d'origine, donc les modifications qui lui sont appliquées ne sont pas répercutées.

    De but en blanc, je tenterai de changer array_push($tab_index, $value['conditions']); en array_push($tab_index, &$value['conditions']);. Mais sans certitudes.

    Tu devrais montrer un exemple de tableau plus parlant (un tableau complet avec de vraies valeurs), le tableau devant en résulter après traitement, ainsi que les fonctions utilisées dans fn_check_conditions. En bref, un code qu'on peut tester avec un simple copier/coller, sans avoir à se demander ce que pourrait être truc, machin ou bidule.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Merci pour ta réponse. J'ai déjà améliorer mon algo en me basant sur le dernier exemple de la page. Cela a suffit à résoudre le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function fn_manage_data_in_other_table(&$tab_native, $level, $tab_json) {
        $level++;
        foreach($tab_native as $key => &$value) {
            if(is_array($value['conditions'])) {
                fn_manage_data_in_other_table($value['conditions'], $level, $tab_json);
            } else {
                fn_decode_data($value, $level, $tab_json);
            }
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Algorithme récursif sur un arbre
    Par Golork dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/12/2012, 10h28
  2. [ActionListener] Evénement sur tableau de boutons
    Par frouge dans le forum Composants
    Réponses: 5
    Dernier message: 08/10/2011, 02h44
  3. Aide sur un algorithme récursif
    Par christianf dans le forum Débuter
    Réponses: 2
    Dernier message: 20/08/2010, 04h35
  4. loop sur tableau associatif
    Par Plawi dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/02/2005, 11h29
  5. Réponses: 25
    Dernier message: 16/07/2003, 20h41

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