Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/03/2011, 12h42   #1
Invité2
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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 :
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 :
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 :
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.
  Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 12h58   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
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 :
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
                )
 
        )
 
)
*/
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 13h27   #3
Invité2
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
ok, merci, mais ça ne fonctionne pas.

En fait je lance une première requête
Code sql :
 SELECT page_id FROM TABLE WHERE parent_id = 0;

Puis pour chaque enregistrement je lance une requete
Code sql :
SELECT page_id FROM TABLE WHERE parent_id = page_id;

Puis pour chaque enregistrement je lance une requete
Code sql :
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.
  Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 17h48   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 18h24   #5
Invité2
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
pour la table "pages"

J'ai les colonnes suivantes :

'page_id','group_id','page_name','url','parent_id',' hierarchy','create_date','modified_date'
  Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 18h25   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
à quoi correspond hierarchy ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 18h36   #7
Invité2
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Hierarchy est l'ordre d'affichage
  Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 18h38   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
donc t'as seulement parent_id pour créer l'arbre.
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 18h50   #9
Invité2
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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 :
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;
}
  Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 18h53   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
pas simple de faire ca en adjancy list, mon code est pour un type path enumeration
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 19h01   #11
Invité2
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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.
  Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 19h07   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
tu peux faire comme ca :

Code :
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.
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 19h14   #13
Invité2
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
ok,merci. Je vais voir ça.
  Envoyer un message privé Réponse avec citation 01
Vieux 06/03/2011, 19h36   #14
Invité2
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Bon, je laise définitivepment tomber les "foreach" lol

Dernière modification par Invité2 ; 06/03/2011 à 19h47.
  Envoyer un message privé Réponse avec citation 01
Vieux 06/03/2011, 19h46   #15
Invité2
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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.
  Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 20h03   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
le tri est à faire après, avec array_multisort, fait aussi un ORDER BY parent, hierachy
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 20h39   #17
Invité2
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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
  Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h37.


 
 
 
 
Partenaires

Hébergement Web