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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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