Comment bien manipuler les array multidimensionnel
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:
Code:
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 |
J'ai créé une fonction qui va m'afficher les menus par niveau (level)
Code:
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;
} |
Cette fonction fonctionne très bien.
Donc si je veux connaitre les categorie enfant du premier niveau je fait
Code:
1 2 3
|
$poolCategories = Category(1,1,2); //ID parent, level1, langue
print_r($poolCategories); |
et j'ai pour le nievau 1
Code:
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 )
) |
Ce qui est très bien.
Maintenant je dois construire $poolCategories de manière à obtenir ca au final. (J'espère que les tabulations deront conservées)
Code:
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 )
) |
Donc mon problème, il commence la, car je vais devoir manipuler les array...
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
Code:
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); |
$poolCategories m'affiche
Code:
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 )
) |
Ce qui est juste.
Et $poolCatLevel2 m'affiche:
Code:
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 )
) |
Ce qui est juste.
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