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] Récursivité array multidimensionnel


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 145
    Par défaut [Tableaux] Récursivité array multidimensionnel
    bonjour,
    j'ai un tableau multidimensionnel de ce type :
    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
    Array (
        [16] => 
        [1] => Array (
            [5] => 
            [9] => Array (
                [18] =>
            )
            [2] => Array (
                [4] => Array (
                    [7] =>
                )
            )
        )
        [6] =>
        [3] => Array (
            [8] => 
        )
        [10] => Array (
            [11] => 
        )
        [17] =>
    )
    les clefs correspondent à des Id et sont tous uniques (quelquesoit leur dimension).
    en ce qui concerne les valeurs, elles sont nulles ou correspondent à d'autres array.
    les profondeurs de chacun des arrays est variable.

    j'aimerai obtenir un nouveau tableau à partir de celui-ci, mais sur 1 dimension uniquement.
    il faudrait qu'il ressemble à ça :
    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
    Array (
        [0]=>16
        [1]=>1
        [2]=>5
        [3]=>9
        [4]=>18
        [5]=>2
        [6]=>4
        [7]=>7
        [8]=>6
        [9]=>3
        [10]=>8
        [11]=>10
        [12]=>11
        [13]=>17
    )
    comme vous le voyez, les anciennes clefs sont devenus des valeurs, et le nouveau tableau à son index incrémenté de 1 à chaque paire clef/valeur.
    de plus, il faut impérativement que les clefs restent dans cet ordre.
    je ne parviens pas à obtenir ce résultat, jai tenter de me faire une fonction récursive mais mon index recommence à 0 dès qu'il doit remonter à la dimension précédente.
    j'ai voulu essayer la fonction array_walk_recursive(), mais celle-ci ne me permet pas d'utiliser les clefs associées à des tableaux.

    est-ce-que quelqu'un peut m'aider? je bloque là-dessus depuis un moment et je commence à saturer.
    merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Par défaut
    Donne le code de ta fonction

    je ne parviens pas à obtenir ce résultat, jai tenter de me faire une fonction récursive mais mon index recommence à 0 dès qu'il doit remonter à la dimension précédente.
    Essaye soit de passer ton index par réference :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function f (&$index, ...) {
    ...
    }
    soit de retourner l'index et de le réutiliser à la dimension précédente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function f ($index, ...) {
    ...
    return $index;
    }
    La 2ème solution est plus propre à mon avis

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 145
    Par défaut
    voilà ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function tree($tree_id,$tab_pre){
    	$output=$tab_pre;
    	foreach($tree_id as $k=>$v){
    		$output[]=$k;
    		if(is_array($v)) tree($v,$output);
    	}
     
    	// sortie
    	return $output;
    }
    elle est appelée la première fois avec $tab_pre=array();

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Par défaut
    Ah oui, ta fonction retourne deja quelque chose, alors faut voir du coté de ma première solution (index par référence).

    Je suis au boulot et je dois y aller, je me pencherais sur le problème demain, j'aime bien la récursion.

    Bonne soirée

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 145
    Par défaut
    je te remercie je vais chercher de ce côté là, je pense que la solution n'est pas bien compliquée mais j'ai du mal avec la récursion.
    bon courage pour le boulot

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Par défaut
    J'ai imprimé ta fonction avant de partir et cogité dans le RER, oubli mes pistes précédentes, c'est ta remarque sur l'index qui revenais à 0 qui m'as trompé. En fait tu étais très proche de la solution, je vais juste y apporter 2 petites modifications :

    1/ Cette modif. ne change rien, c'est juste par souci de simplification (et oui c'est compliqué de faire simple), j'ai fusionné les variables $output et $tab_pre en $table, en effet elles sont redondante car tu fait $output=$tab_pre;

    2/ Et la est le coeur du problème, dans la fonction de niveau n tu ne récupère pas le résultat de la fonction (return) de niveau n+1

    Ta fonction modifiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function tree($tree,$table){
     
    	foreach($tree as $k=>$v){
    		$output[]=$k;
    		if(is_array($v)) $table = tree($v,$table);
    	}
    	return $table;
    }
    Note que j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(is_array($v)) tree($v,$table);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(is_array($v)) $table = tree($v,$table);
    Je n'ai pas testé mais ca devrais être bon, tu me diras, A+

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

Discussions similaires

  1. [PHP 5.3] [Tableaux] class array multidimensionnels
    Par dad72 dans le forum Langage
    Réponses: 8
    Dernier message: 22/04/2009, 15h46
  2. [Tableaux] Tri d'un array multidimensionnel
    Par amans dans le forum Langage
    Réponses: 3
    Dernier message: 22/04/2008, 16h11
  3. [Tableaux] Récursivité include / fonction
    Par francis m dans le forum Langage
    Réponses: 14
    Dernier message: 16/05/2006, 22h14
  4. [Tableaux] Affichage Array
    Par dafalri dans le forum Langage
    Réponses: 6
    Dernier message: 06/12/2005, 11h55
  5. création de tableaux avec Array() et élément 'fantome'
    Par Talieth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/11/2005, 09h49

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