Bonjour,
Je cherche à réaliser un menu catégories avec un niveau de sous-catégories.
J'utilise une fonction récursive...

Voici le résultat de mon tableau ($catzo) qui contient les informations de mes catégories :

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
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => Aucune
            [slug] => aucune
            [category] => non
            [date] => 
            [parent_id] => 0
        )
 
    [1] => stdClass Object
        (
            [id] => 12
            [name] => Incontinence
            [slug] => incontinence
            [category] => oui
            [date] => 
            [parent_id] => 0
        )
 
    [2] => stdClass Object
        (
            [id] => 17
            [name] => Bandagisterie
            [slug] => bandagisterie
            [category] => oui
            [date] => 
            [parent_id] => 0
        )
 
    [3] => stdClass Object
        (
            [id] => 21
            [name] => Confort
            [slug] => confort
            [category] => oui
            [date] => 
            [parent_id] => 0
        )
 
    [4] => stdClass Object
        (
            [id] => 22
            [name] => Vie quotidienne
            [slug] => vie-quotidienne
            [category] => oui
            [date] => 
            [parent_id] => 0
        )
 
    [5] => stdClass Object
        (
            [id] => 23
            [name] => Equipement medical
            [slug] => equipement-medical
            [category] => oui
            [date] => 
            [parent_id] => 0
        )
 
    [6] => stdClass Object
        (
            [id] => 24
            [name] => Bas de compression
            [slug] => bas-de-compression
            [category] => oui
            [date] => 
            [parent_id] => 0
        )
 
    [7] => stdClass Object
        (
            [id] => 25
            [name] => Sport et bien etre
            [slug] => sport-et-bien-etre
            [category] => oui
            [date] => 
            [parent_id] => 0
        )
 
    [8] => stdClass Object
        (
            [id] => 26
            [name] => Mobilite
            [slug] => mobilite
            [category] => oui
            [date] => 
            [parent_id] => 0
        )
 
    [9] => stdClass Object
        (
            [id] => 27
            [name] => Salle de bain
            [slug] => salle-de-bain
            [category] => oui
            [date] => 
            [parent_id] => 0
        )
 
    [10] => stdClass Object
        (
            [id] => 29
            [name] => ORL
            [slug] => orl
            [category] => oui
            [date] => 
            [parent_id] => 0
        )
 
    [11] => stdClass Object
        (
            [id] => 34
            [name] => cou
            [slug] => cou
            [category] => oui
            [date] => 
            [parent_id] => 17
        )
 
    [12] => stdClass Object
        (
            [id] => 33
            [name] => Dos
            [slug] => dos
            [category] => oui
            [date] => 
            [parent_id] => 17
        )
 
    [13] => stdClass Object
        (
            [id] => 35
            [name] => epaule
            [slug] => epaule
            [category] => oui
            [date] => 
            [parent_id] => 17
        )
 
    [14] => stdClass Object
        (
            [id] => 36
            [name] => Poignet et main
            [slug] => poignet-et-main
            [category] => oui
            [date] => 
            [parent_id] => 17
        )
 
)
Voici le résultat de mon second tableau ($end_array) que j'obtiens à l'aide de ma fonction récursive :
Cette fonction correcte car quand je change le parent_id de n'importe quelle catégorie au hasard, il me la classe correctement !
Cependant je n'arrive pas à récupérer le nom de mes catégories pour ensuite les classer de manière identique...

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
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 12
            [17] => Array
                (
                    [0] => 34
                    [1] => 33
                    [2] => 35
                    [3] => 36
                )
 
            [18] => 21
            [19] => 22
            [20] => 23
            [21] => 24
            [22] => 25
            [23] => 26
            [24] => 27
            [25] => 29
        )
 
)
J'ai l'impression d'être sur la bonne voie mais je ne vois pas comment récupérer les noms de mes cats à afficher...


Et pour finir voici ma fonction récursive :

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
 
	$initialArray = array();
 
	foreach ($catzo as $key => $value) {
		# code...
		$initialArray[$value->id] = $value->parent_id;
 
 
	}
 
// VOICI LE RESULTAT DU TABLEAU $initialArray()
//
//	$initialArray = array(
//
//		# cat_id => parent_id
//
//	    '1' => 0,
//	    '12' => 0,
//	    '17' => 0,
//	    '21' => 0,
//	    '22' => 0,
//	    '23' => 0,
//	    '24' => 0,
//	    '25' => 0,
//	    '26' => 0,
//	    '27' => 0,
//	    '29' => 0,
//	    '34' => 17,
//	    '33' => 17,
//	    '35' => 17,
//	    '36' => 17,
//
//	);
 
	// resituate the array
	$parent_ids = array();
	foreach ($initialArray as $category_id => $parent_id) {
	    if (!isSet($parent_ids[$parent_id])) {
	        $parent_ids[$parent_id] = array();
	    }
 
	    $parent_ids[$parent_id][] = $category_id;
 
	}
 
	// end_array is the result
	$end_array = array();
 
	/**
	 * Takes the key of the parent, the current set that it's working off of, the list of parent ids for reference
	 * and the current place in the end result array, acting recursively
	 */
 
	function recursive($parent_key, $current_set, $parent_ids, $end_array) {
	    foreach ($current_set as $parent_value) {
	        if (!isSet($parent_ids[$parent_value])) {
	            $end_array[$parent_key][] = $parent_value;
	        } else {
	            // if the parent_value is found in parent_ids, pass those values to the same function and the current end_array position
	            $end_array[$parent_key] = recursive($parent_value, $parent_ids[$parent_value], $parent_ids, $end_array[$parent_key]);
	        }
	    }
	    return $end_array;
	}
 
	// start with the top most element
	$end_array = recursive(key($parent_ids), current($parent_ids), $parent_ids, $end_array);