Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
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 01/10/2011, 13h49   #1
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Par défaut Module menus pour mes sites

Bonjour,
J'ai une table menus_items qui renferme les items de mes menus. Chaque menu est identifié par menu_id. Les items de 1er niveau d'un menu ont pour pour parent_id = 0. Et pour générer un menu par exemple 1 je fais
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
 
//Générer un menu par id
function getNav($id_menu) {
	global $db;
	$nav = '';
	$sql = 'SELECT id_item as item_id, menu_id as nav_id FROM menus_items
			WHERE menu_id = :id_menu AND parent_id = :id_parent
			ORDER BY rang_item';
	$statement = $db->prepare($sql);
	$statement->execute(array(':id_menu' => $id_menu, ':id_parent' => 0));
    $tabl_results = $statement->fetchAll();
	if(count($tabl_results)>0){
		$nav .= '<ul class="menu-liste">';
		foreach($tabl_results as $tabl_result) {
			$nav .= getsubnav($tabl_result['nav_id'], $tabl_result['item_id']);
		}
		$nav .= '</ul>';
	}
	return $nav;
}
 
//Gestion des arbres
function getsubnav($id_menu, $id_item) {
    global $db;
	$subnav = '';
	//Ajout de l'élément principal dans $subnav
	$sql = 'SELECT id_item as item_id, type_item as libelle, url_item as url FROM menus_items
			WHERE id_item = :id_item AND menu_id = :id_menu';
	$statement = $db->prepare($sql);
	$statement->execute(array(':id_menu' => $id_menu, ':id_item' => $id_item));
	$tabl_result = $statement->fetch();
	$subnav .= '<li class="menu-entree"><a href="'.$tabl_result['url'].'">'.$tabl_result['libelle'].'</a>';
 
	//Si l'élément a des enfants
	$sql2 = 'SELECT id_item as item_id, type_item as libelle, url_item as url, menu_id as nav_id FROM menus_items
			WHERE parent_id = :id_item AND menu_id = :id_menu
			ORDER BY rang_item';
	$statement2 = $db->prepare($sql2);
	$statement2->execute(array(':id_menu' => $id_menu, ':id_item' => $id_item));
	$tabl_results = $statement2->fetchAll();
	if( count($tabl_results) !=0 ){
		$subnav .= '<ul class="menu-liste">';
		foreach($tabl_results as $tabl_result) {
			$subnav .= '<li class="menu-entree">';
			$subnav .= '<a href="'.$tabl_result['url'].'">'.$tabl_result['libelle'].'</a>';
			$subnav .= getsubnav($tabl_result['nav_id'], $tabl_result['item_id']);
			$subnav .= '</li>';
		}
		$subnav .= '</ul>';
	}	
	$subnav .= '</li>';
	return $subnav;
}
Je souhaite que ces fonction me gérèrent des arbres html à plusieurs niveaux quelque soit la profondeur.

Le problème que est que la fonction récursive duplique les entrées des sous menus.

Merci d'avance pour votre aide.

Meilleure salutations.
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 10h45   #2
Membre éclairé
 
Avatar de firehist
 
Homme Benjamin Longearet
Intégrateur Web Freelance
Inscription : février 2008
Messages : 153
Détails du profil
Informations personnelles :
Nom : Homme Benjamin Longearet
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Intégrateur Web Freelance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2008
Messages : 153
Points : 357
Points : 357
Envoyer un message via Skype™ à firehist
Bonjour,

Pour une table comme ci-dessous:
Code :
1
2
3
4
 
id INT(10)
parent_id INT(10)
name VARCHAR(60)
Je ferai les méthodes suivantes:
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
 
/**
 * Fonction d'initialisation du tableau des menus en PHP
 * @param $id_menu int L'identifiant du menu père
 * @return array Tableau du menu $id_menu et de ces sous-menus
 */
function getNav($id_menu) {
	$query = "SELECT id, parent_id, name FROM menus ORDER BY name ASC";
	$result = mysql_query($query);
	$menus = array();
	$main_menu = "";
	while($row = mysql_fetch_assoc($result)) {
		$menus[] = $row;
		if($row['id'] == $id_menu) $main_menu = $row['name'];
	}
	mysql_free_result($result);
	return array('name' => $main_menu, 'subs' => getNavContent($id_menu, $menus));
}
 
/**
 * Fonction récursive qui travail sur le tableau PHP passé en paramètre
 * @param $id_menu int L'identifiant du menu père
 * @param $menus array Tableau des menus
 * @return array Tableau du menu $id_menu et de ces sous-menus
 */
function getNavContent($id_menu, $menus) {
	$return = array();
	$menu_name = null;
	// On parcours le tableau PHP
	foreach ($menus AS $noeud) {
		// Si on trouve un menu avec comme parent $id_menu
		if ($id_menu == $noeud['parent_id']) {
			$return[] = array(
				'name' => $noeud['name'],
				'subs' => getNavContent($noeud['id'], $menus)
			);
		}
	}
	// Si pas de sous-menus, on met false
	if(count($return) < 1) $return = false;
	return $return;
}
 
print_r(getNav(2));
Tu obtiens un tableau PHP comme résultat de la forme:
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
 
Array
(
    [name] => Actualité
    [subs] => Array
        (
            [0] => Array
                (
                    [name] => Evenements
                    [subs] => 
                )
 
            [1] => Array
                (
                    [name] => Importantes
                    [subs] => Array
                        (
                            [0] => Array
                                (
                                    [name] => Externes
                                    [subs] => 
                                )
 
                            [1] => Array
                                (
                                    [name] => Internes
                                    [subs] => 
                                )
 
                        )
 
                )
 
        )
 
)
__________________
Ingénieur Web Freelance - Firehist Studio
Profil Viadeo Benjamin Longearet
Geekos.fr : Blog technique sur les technologies du Web
---
Citation:
De l'innovation nait la solution et inversement
firehist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 13h50   #3
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Citation:
Envoyé par firehist Voir le message
Tu obtiens un tableau PHP comme résultat de la forme:
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
 
Array
(
    [name] => Actualité
    [subs] => Array
        (
            [0] => Array
                (
                    [name] => Evenements
                    [subs] => 
                )
 
            [1] => Array
                (
                    [name] => Importantes
                    [subs] => Array
                        (
                            [0] => Array
                                (
                                    [name] => Externes
                                    [subs] => 
                                )
 
                            [1] => Array
                                (
                                    [name] => Internes
                                    [subs] => 
                                )
 
                        )
 
                )
 
        )
 
)
Et comment parcourir ce array dont d'avance on ne peut prévenir la profondeur ?

Merci d'avance...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 15h05   #4
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Voici mon print_array
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
 
Array
(
    [0] => Array
        (
            [name] => Canins
            [url] => 8
            [subs] => Array
                (
                    [0] => Array
                        (
                            [name] => Chiens
                            [url] => 12
                            [subs] => 
                        )
 
                    [1] => Array
                        (
                            [name] => Loups
                            [url] => 11
                            [subs] => 
                        )
 
                )
 
        )
 
    [1] => Array
        (
            [name] => Félin
            [url] => 1
            [subs] => Array
                (
                    [0] => Array
                        (
                            [name] => Grands Félins
                            [url] => 2
                            [subs] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => Lions
                                            [url] => 4
                                            [subs] => 
                                        )
 
                                    [1] => Array
                                        (
                                            [name] => Panthères
                                            [url] => 3
                                            [subs] => 
                                        )
 
                                    [2] => Array
                                        (
                                            [name] => Tigres
                                            [url] => 6
                                            [subs] => 
                                        )
 
                                )
 
                        )
 
                    [1] => Array
                        (
                            [name] => Petits Félins
                            [url] => 5
                            [subs] => 
                        )
 
                )
 
        )
 
    [2] => Array
        (
            [name] => Poissons
            [url] => 7
            [subs] => Array
                (
                    [0] => Array
                        (
                            [name] => Requins
                            [url] => 10
                            [subs] => 
                        )
 
                    [1] => Array
                        (
                            [name] => Saumons
                            [url] => 9
                            [subs] => 
                        )
 
                )
 
        )
 
)
et un test de parcours pour générer une liste non ordonnée
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
function foreachArray($array){
	$html = "";
	if ( count($array )> 0 ) {
		$html .= '<ul>';
		foreach($array as $item){
			$html .= '<li><a href="?'.$item['url'].'">'.$item['name'].'</a> ';
			if(is_array($item['subs'])) foreachArray($item['subs']);
			$html .= '</li>';
		}
		$html .= '</ul>';
	}
 
	return $html;
}
/* Résultat
<ul>
	<li><a href="?8">Canins</a> </li>
	<li><a href="?1">Félin</a> </li>
	<li><a href="?7">Poissons</a> </li>
</ul>
*/
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 15h22   #5
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
function foreachArray($array){
	$html = "";
	if ( count($array )> 0 ) {
		$html .= '<ul>';
		foreach($array as $item){
			$html .= '<li><a href="?'.$item['url'].'">'.$item['name'].'</a> ';
			is_array($item['subs']) ? $html .= foreachArray($item['subs']) : null;
			$html .= '</li>';
		}
		$html .= '</ul>';
	}
	return $html;
}
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 23h04   #6
Membre éclairé
 
Avatar de firehist
 
Homme Benjamin Longearet
Intégrateur Web Freelance
Inscription : février 2008
Messages : 153
Détails du profil
Informations personnelles :
Nom : Homme Benjamin Longearet
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Intégrateur Web Freelance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2008
Messages : 153
Points : 357
Points : 357
Envoyer un message via Skype™ à firehist
Un array se parcours très bien sans en connaître la profondeur.

J'avais oublié de copier coller ce code, mais je vois que le tiens est identique.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
function displayMenu($array) {
	$html = "<ul>";
	foreach($array as $row) {
		$html .= '<li>';
		if(is_array($row['subs']) && count($row['subs']) > 0) {
			$html .= displayMenu($row['subs']);
		} else {
			$html .= '<a href="' . $row['url'] .'">' . $row['name'] .'</a>';
		}
		$html .= '</li>';
	}
	$html .= "</ul>";
	return $html;
}
__________________
Ingénieur Web Freelance - Firehist Studio
Profil Viadeo Benjamin Longearet
Geekos.fr : Blog technique sur les technologies du Web
---
Citation:
De l'innovation nait la solution et inversement
firehist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 15h49   #7
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Citation:
Envoyé par firehist Voir le message
Code :
1
2
3
4
 
function displayMenu($array) {
...
}
+ 10 sur le nom de la fonction.

Merci pour ton aide.
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 17h12   #8
Membre éclairé
 
Avatar de firehist
 
Homme Benjamin Longearet
Intégrateur Web Freelance
Inscription : février 2008
Messages : 153
Détails du profil
Informations personnelles :
Nom : Homme Benjamin Longearet
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Intégrateur Web Freelance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2008
Messages : 153
Points : 357
Points : 357
Envoyer un message via Skype™ à firehist
Y'a pas d'quoi!

Bon dév'
__________________
Ingénieur Web Freelance - Firehist Studio
Profil Viadeo Benjamin Longearet
Geekos.fr : Blog technique sur les technologies du Web
---
Citation:
De l'innovation nait la solution et inversement
firehist est déconnecté   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 03h50.


 
 
 
 
Partenaires

Hébergement Web