Bonjour à tous,
Je dois reproduire l'arborescence de mon menu, et je refais tout mon code avec le but de le faire plus propre et plus simple. Simplement je me prend énormément le chou et je me demande si j'utilise la meilleur manière.
Je travaille avec des array et je pense que ne les manipule pas correctement.
Présentation:
Mon arborescence (categorie ou menu) est le suivant:
J'ai créé une fonction qui va m'afficher les menus par niveau (level)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 -root (id = 1) --iPod(id = 2) => level1 ---test2 (id = 5 ) => level2 ----test3 (id = 6) => level3 -----test4(id = 7) => level4 ----test33 (id = 12) => level3 ---test22 (id = 10) => level2 ---test222 (id = 11) => level2 --Accessoire (id = 3) => level1 --Portable (id = 4) => level1 --Autres (id = 9) => level1
Cette fonction fonctionne très bien.
Code PHP : 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 // FUNCTION // $ id_parent => id de la categorire parent dont on veut connaitre ses catégorie enfant // $level_depth => Niveau (level) des categories // $langugee => langue :o) (peut d'incidence) function Category($id_parent, $level_depth, $language){ $query = " SELECT DISTINCT c.id_category, COUNT(cp.id_product) as nbProd, c.level_depth, c.id_parent, c.active, l.id_category, l.name, l.id_lang FROM "._DB_PREFIX_."category c INNER JOIN "._DB_PREFIX_."category_lang l ON c.id_category = l.id_category LEFT JOIN "._DB_PREFIX_."category_product cp ON c.id_category = cp.id_category WHERE c.active = 1 AND c.level_depth = ".$level_depth." AND c.id_parent = ".$id_parent." AND l.id_lang = ".$language." GROUP BY c.id_category ORDER BY l.name ASC"; $result = Db::getInstance()->s($query); // Nb de categoreis du premier niveau $nbCat = sizeof($result); // Commence à 1 et pas 0 // Dans le cas des sous-categorie; s'il y en a pas pour une categorie parent, il return 0, donc rien en sortie if($nbCat) return $result; }
Donc si je veux connaitre les categorie enfant du premier niveau je fait
et j'ai pour le nievau 1
Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $poolCategories = Category(1,1,2); //ID parent, level1, langue print_r($poolCategories);
Ce qui est très bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Array ( [0] => Array ( [id_category] => 3 [nbProd] => 2 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Accessoires [id_lang] => 2 ) [1] => Array ( [id_category] => 2 [nbProd] => 3 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => iPods [id_lang] => 2 ) [2] => Array ( [id_category] => 4 [nbProd] => 2 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Portables [id_lang] => 2 ) [3] => Array ( [id_category] => 9 [nbProd] => 4 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => test [id_lang] => 2 ) )
Maintenant je dois construire $poolCategories de manière à obtenir ca au final. (J'espère que les tabulations deront conservées)
Donc mon problème, il commence la, car je vais devoir manipuler les array...
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 ( [id_category] => 3 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Accessoires [id_lang] => 2 ) [1] => Array ( [id_category] => 9 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Autre [id_lang] => 2 ) [2] => Array ( [id_category] => 2 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => iPods [id_lang] => 2 [child] => Array ( [0] => Array ( [id_category] => 5 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test2 [id_lang] => 2 [child] => Array ( [0] => Array ( [id_category] => 6 [level_depth] => 3 [id_parent] => 5 [active] => 1 [name] => test3 [id_lang] => 2 [child] => Array ( [0] => Array ( [id_category] => 7 [level_depth] => 4 [id_parent] => 6 [active] => 1 [name] => test4 [id_lang] => 2 ) ) ) [1] => Array ( [id_category] => 12 [level_depth] => 3 [id_parent] => 5 [active] => 1 [name] => test33 [id_lang] => 2 ) ) ) [1] => Array ( [id_category] => 10 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test22 [id_lang] => 2 ) [2] => Array ( [id_category] => 11 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test222 [id_lang] => 2 ) ) ) [3] => Array ( [id_category] => 4 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Portables [id_lang] => 2 ) )
Je ne sais pas si j'ai dois tout faire avec des forerach(), mais je me demande alors s'il y a pas plus simple à faire des fonctions liés aux array.
Par exemple pour le niveau deux, j'y arrive sans problème car c'est simple
$poolCategories m'affiche
Code PHP : 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 $poolCatLevel2 = array(); foreach($poolCategories as $key1 => $val1){ $catLevel2 = Category($poolCategories[$key1]['id_category'],2,2); if(!empty($catLevel2)){ $poolCategories[$key1]['child'] = $catLevel2; $poolCatLevel2 = array_merge($poolCatLevel2, $catLevel2); } } print_r($poolCatLevel2); print_r($poolCategories);
Ce qui est juste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Array ( [0] => Array ( [id_category] => 3 [nbProd] => 2 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Accessoires [id_lang] => 2 ) [1] => Array ( [id_category] => 9 [nbProd] => 4 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Autre [id_lang] => 2 ) [2] => Array ( [id_category] => 2 [nbProd] => 3 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => iPods [id_lang] => 2 [child] => Array ( [0] => Array ( [id_category] => 5 [nbProd] => 1 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test2 [id_lang] => 2 ) [1] => Array ( [id_category] => 10 [nbProd] => 0 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test22 [id_lang] => 2 ) [2] => Array ( [id_category] => 11 [nbProd] => 0 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test222 [id_lang] => 2 ) ) ) [3] => Array ( [id_category] => 4 [nbProd] => 2 [level_depth] => 1 [id_parent] => 1 [active] => 1 [name] => Portables [id_lang] => 2 ) )
Et $poolCatLevel2 m'affiche:
Ce qui est juste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Array ( [0] => Array ( [id_category] => 5 [nbProd] => 1 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test2 [id_lang] => 2 ) [1] => Array ( [id_category] => 10 [nbProd] => 0 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test22 [id_lang] => 2 ) [2] => Array ( [id_category] => 11 [nbProd] => 0 [level_depth] => 2 [id_parent] => 2 [active] => 1 [name] => test222 [id_lang] => 2 ) )
Maintenat pour construire le niveau trois, la ca devient la galère, car j'utilise des foreach à tort et à travers.
C'est là, si vous avez pu prendre le temps de me lire, que j'aimerais avoir vos lumières.
Comment me recommendriez vous de faire, car je peux extraire (avec ma fonction) les différentes categories de chaque niveau, mais je dois les merger dans $poolCategories au bon endroit.
Y-a-t-il matière à faire avec des fonctions array http://www.php.net/manual/en/function.array.php?
Je vous remercie énormément pour votre lectures et consiels
Partager