Vous pouvez récupérer toutes les catégories en même temps.
Supposons que vous ayez un résultat plat provenant de la base de données, comme ceci :
$categories = array(
array('id' => 1, 'parent' => 0, 'name' => 'Category A'),
array('id' => 2, 'parent' => 0, 'name' => 'Category B'),
array('id' => 3, 'parent' => 0, 'name' => 'Category C'),
array('id' => 4, 'parent' => 0, 'name' => 'Category D'),
array('id' => 5, 'parent' => 0, 'name' => 'Category E'),
array('id' => 6, 'parent' => 2, 'name' => 'Subcategory F'),
array('id' => 7, 'parent' => 2, 'name' => 'Subcategory G'),
array('id' => 8, 'parent' => 3, 'name' => 'Subcategory H'),
array('id' => 9, 'parent' => 4, 'name' => 'Subcategory I'),
array('id' => 10, 'parent' => 9, 'name' => 'Subcategory J'),
);
Vous pouvez créer une fonction simple qui transforme cette liste plate en une structure, de préférence à l'intérieur d'une fonction. J'utilise la fonction pass-by-reference pour qu'il n'y ait qu'un seul tableau par catégorie et non plusieurs copies du tableau pour une catégorie.
function categoriesToTree(&$categories) {
Une carte permet de rechercher rapidement les catégories. Ici, j'ai également créé un tableau fictif pour le niveau "Root".
$map = array(
0 => array('subcategories' => array())
);
J'ai ajouté un autre champ, les sous-catégories, à chaque tableau de catégories, et je l'ai ajouté à la carte.
foreach ($categories as &$category) {
$category['subcategories'] = array();
$map[$category['id']] = &$category;
}
Boucle à nouveau dans chaque catégorie, en s'ajoutant à la liste des sous-catégories de son parent. La référence est importante ici, sinon les catégories déjà ajoutées ne seront pas mises à jour lorsqu'il y aura plus de sous-catégories.
foreach ($categories as &$category) {
$map[$category['parent']]['subcategories'][] = &$category;
}
Enfin, renvoyer les sous-catégories de cette catégorie fictive qui font référence à toutes les catégories de premier niveau._
return $map[0]['subcategories'];
}
Utilisation :
$tree = categoriesToTree($categories);
Et voici le code en action sur Codepad .
0 votes
Vous pouvez utiliser la classe TreeNode à cette fin. Dans cette classe, vous pouvez obtenir n'importe quel nœud enfant et ensuite itérer dans ses enfants. Téléchargez-la ici : asimishaq.com/ressources/arbre-structure-données-en-php