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 :

remplisage tableau via fonction récursive


Sujet :

Langage PHP

  1. #1
    Invité2
    Invité(e)
    Par défaut remplisage tableau via fonction récursive
    Bonjour,

    J'ai encore besoin de vos lumières pour l'enregistrement d'un tableau avec une fonction récursive .

    voilà ma fonction :
    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
     
    public function GetMenu($uid,$level='0'){
     
    		$Param = array('id'=> $uid,'pid'=>$level);
    		$query = "SELECT P.page_id,P.parent_id,P.page_name,P.url,P.hierarchy
    											FROM ".$this->__get('db_prefix')."_backend_pages P
    											INNER JOIN ".$this->__get('db_prefix')."_groups G ON FIND_IN_SET( G.group_id, P.group_id )
    											INNER JOIN ".$this->__get('db_prefix')."_users U ON U.group_id = G.group_id
    											WHERE U.user_id = :id AND P.parent_id = :pid  ORDER BY hierarchy";
    		$menu = $this->GetDb()->read( $query,$Param);
    		for($i = 0 ; $i < count($menu); $i++) { 
    			$ListItem[$i] = array('page_id'=>$menu[$i]['page_id'],'parent_id'=>$menu[$i]['parent_id'],'page_name'=>constant($menu[$i]['page_name']),'url'=>$menu[$i]['url']);
    			array_push($ListItem[$i],self::GetMenu($uid,$menu[$i]['page_id']));
    		}
    		return $ListItem;
    	}
    La fonction read retourne une tableau via "fetchAll()"

    Ce que j'obtiens :
    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
     
    Array ( 
             [0] => Array ( 
                               [page_id] => 1 [parent_id] => 0 [page_name] => page1 [url] => page1.php 
                               [0] => Array ( 
                                                 [0] => Array ( 
                                                                   [page_id] => 8 [parent_id] => 1 [page_name] => page1_1 [url] => page1_1.php 
                                                                   [0] => 
                                                                    ) 
                                                 [1] => Array ( 
                                                                   [page_id] => 9 [parent_id] => 1 [page_name] => page1_2 [url] => page1_2.php 
                                                                   [0] => 
                                                                    ) 
                                                 [2] => Array ( 
                                                                   [page_id] => 10 [parent_id] => 1 [page_name] => page1_3 [url] => page1_3.php 
                                                                   [0] => 
                                                                   )
                                                   ) 
               )
              [1] => Array ( 
                                [page_id] => 2 [parent_id] => 0 [page_name] => page2 [url] => page2.php 
                                [0] => Array ( 
                                                  [0] => Array ( 
    [page_id] => 11 [parent_id] => 2 [page_name] => page2_1 [url] => page2_1.php 
                                                                   [0] => 
                                                                    ) 
                                                  ) 
                                )
    )
    Ce que je voudrais obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Array ( 
           [0] => Array (
                             [page_id] => 0 [parent_id] => 0 [page_name] => page1 [page_url] => page1.php 
                             [0] => Array ( [page_id] => 8 [parent_id] => 0 [page_name] => page1_1 [page_url] => page1_1.php ) 
                             [1] => Array ( [page_id] => 9 [parent_id] => 0 [page_name] => page1_2 [page_url] => page1_2.php ) 
                              ) 
           [1] => Array(
                           [page_id] => 0 [parent_id] => 0 [page_name] => page2 [page_url] => page2.php 
                           [0] => Array ( [page_id] => 8 [parent_id] => 0 [page_name] => page2_1 [page_url] => page2_1.php ) 
                           [1] => Array ( [page_id] => 9 [parent_id] => 0 [page_name] => page2_2 [page_url] => page2_2.php ) 
                              )
    )
    Ce tableau me permettra d'afficher un menu dans un template smarty.

    une idée ?
    Merci.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    pas besoin de récursif pour ca, de l'itératif suffis c'est très facile a faire avec les références.

    Ps:
    pour parcourir un tableau c'est foreach pas for
    array_push n'est pas optimiser pour insérer qu'une seule valeur, fait $array[]


    EDIT : un exemple de code

    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
    $array = array(
             '1/2/3/4' => 'test1', 
             '1/5/6'   => 'test2',
             '8/9'     => 'test3',
             '1/2/10'  => 'test4',
             '3/14/15' => 'test5'
             );
     
    $tree = array();
     
    foreach($array as $path => $item)
    {
        $current = &$tree;
        $paths   = explode('/', $path);
     
        foreach($paths as $parent)
        {
            if(false === array_key_exists($parent, $current))
            {
                $current[$parent] = array();
            }
     
            $current = &$current[$parent];
        }
     
        $current = $item;
    }
     
    echo '<pre>', print_r($tree, true), '</pre>';
     
    /*
    Array
    (
        [1] => Array
            (
                [2] => Array
                    (
                        [3] => Array
                            (
                                [4] => test1
                            )
     
                        [10] => test4
                    )
     
                [5] => Array
                    (
                        [6] => test2
                    )
     
            )
     
        [8] => Array
            (
                [9] => test3
            )
     
        [3] => Array
            (
                [14] => Array
                    (
                        [15] => test5
                    )
     
            )
     
    )
    */

  3. #3
    Invité2
    Invité(e)
    Par défaut
    ok, merci, mais ça ne fonctionne pas.

    En fait je lance une première requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
     select page_id from table where parent_id = 0;

    Puis pour chaque enregistrement je lance une requete
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select page_id from table where parent_id = page_id;

    Puis pour chaque enregistrement je lance une requete
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select page_id from table where parent_id = page_id;
    , etc...



    Mais je me demande si je ne devrais pas faire comme toi (moins de requêtes donc moins de ressource ):
    je lance une requête qui sélectionne toutes les pages et je traite chaque ligne retournée par la requête.
    Mais si je fais comme cela, y a t'il moyen de trier via une colonne "hierarchy" ?
    Dernière modification par Deepin ; 07/03/2011 à 06h53. Motif: Merci d'utiliser la balise [code] (bouton #) de l'editeur.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    il faut tout récupérer d'un coup, après ca dépend comment est fait ta table, si t'a le path ou pas si t'as une notion de profondeur ou pas

  5. #5
    Invité2
    Invité(e)
    Par défaut
    pour la table "pages"

    J'ai les colonnes suivantes :

    'page_id','group_id','page_name','url','parent_id',' hierarchy','create_date','modified_date'

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    à quoi correspond hierarchy ?

  7. #7
    Invité2
    Invité(e)
    Par défaut
    Hierarchy est l'ordre d'affichage

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    donc t'as seulement parent_id pour créer l'arbre.

  9. #9
    Invité2
    Invité(e)
    Par défaut
    oui, parent_id
    j'ai testé ça sans succès car je bloque sur le array_key_exist(). Et il n'y a pas le tri pour l'affichage (hierarchy).
    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
     
    public function GetMenu($uid,$pid='0'){
     
    	$Param = array('id'=> $uid);
    	$query = "SELECT P.page_id,P.parent_id,P.page_name,P.url,P.hierarchy
    										FROM ".$this->__get('db_prefix')."_backend_pages P
    										INNER JOIN ".$this->__get('db_prefix')."_groups G ON FIND_IN_SET( G.group_id, P.group_id )
    										INNER JOIN ".$this->__get('db_prefix')."_users U ON U.group_id = G.group_id
    										WHERE U.user_id = :id ORDER BY hierarchy ASC";
    	$menu = $this->GetDb()->read2($query,$Param);
     
    	$temp = array();
     
    	foreach($menu as $item => $value )
    	{
    		$current = &$temp;
    		foreach($value as $parent)
    		{
    			if(false === array_key_exists($parent['page_id'], $current['parent_id']))
    			{
    			$current[] = array('page_id'=>$parent['page_id'],'parent_id'=>$parent['parent_id'],'page_name'=>constant($parent['page_name']),'url'=>$parent['url']);
    			}
    			$current = &$current[$parent];
    		}
    	}
    	return $current;
    }

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    pas simple de faire ca en adjancy list, mon code est pour un type path enumeration

  11. #11
    Invité2
    Invité(e)
    Par défaut
    voilà des termes techniques que je ne connais pas lol

    Arf, je vais retenter ma chance avec la récursivité.

    Merci quand même pour ton aide.

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    tu peux faire comme ca :

    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
    $array = array(
            array('id' => 1, 'parent' => null, 'title' => 'test1'),
            array('id' => 2, 'parent' => null, 'title' => 'test2'),
            array('id' => 3, 'parent' => 1, 'title' => 'test3'),
            array('id' => 4, 'parent' => 3, 'title' => 'test4'),
            array('id' => 5, 'parent' => 2, 'title' => 'test5'),
            );
     
    $tree = array();
     
    foreach($array as $item)
    {
        $id = $item['id'];
        $tree[$id] = $item;
    }
     
    foreach($array as $item)
    {
        $id     = $item['id'];
        $parent = $item['parent'];
     
        if(!empty($parent))
        {
            $tree[$parent]['children'][$id] = &$tree[$id]; 
        }
    }
     
    foreach($tree as $item)
    {
        $id     = $item['id'];
        $parent = $item['parent'];
     
        if(!empty($parent))
        {
            unset($tree[$id]);
        }
    }
     
    print_r($tree);
    EDIT : j'ai corrigé une petite erreur.

  13. #13
    Invité2
    Invité(e)
    Par défaut
    ok,merci. Je vais voir ça.

  14. #14
    Invité2
    Invité(e)
    Par défaut
    Bon, je laise définitivepment tomber les "foreach" lol
    Dernière modification par Invité2 ; 06/03/2011 à 19h47.

  15. #15
    Invité2
    Invité(e)
    Par défaut
    Bon, je laisse définitivement tomber les "foreach" lol

    le résultat n'est pas celui que je voulais car le tri n'est pas bon(me suis peut être trompé quelque part)

    Je vais retenter ma chance avec la récursivité lol

    Merci pour ton aide.

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    le tri est à faire après, avec array_multisort, fait aussi un ORDER BY parent, hierachy

  17. #17
    Invité2
    Invité(e)
    Par défaut
    Ca marche ! J'ai juste ajouté le tri sur parent_id en plus de hierarchy dans la requête.

    Demain, je remet ca pour smarty.

    Merci beaucoup pour ton aide stealth35

Discussions similaires

  1. Macro - balayer cellules tableau et fonction récursive
    Par juliette32 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/05/2014, 00h59
  2. Récup id_article via fonction récursive
    Par Invité dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/03/2013, 17h33
  3. Réponses: 4
    Dernier message: 18/09/2007, 10h46
  4. [SQL] Fonction récursive et enregistrement tableau ?
    Par yazerty dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 10/09/2007, 21h06
  5. appel xmlservice via fonction javascript
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 06/05/2003, 14h24

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