Pour représenter efficacement les données hiérarchiques, envisagez d'utiliser une table de fermeture. Dans ce contexte, une table de fermeture entretient les relations entre les ancêtres et les descendants d'une structure arborescente, ce qui rend efficace la récupération et la représentation de la hiérarchie.
Pour interroger la structure arborescente, nous peut exécuter une requête SQL qui récupère les descendants d'un nœud donné ainsi que leurs niveaux dans la hiérarchie. Voici un exemple de requête qui récupère les descendants jusqu'à un niveau spécifié :
SELECT d.*, p.a AS '_parent' FROM longnames AS a JOIN closure AS c ON (c.a = a.tsn) JOIN longnames AS d ON (c.d = d.tsn) LEFT OUTER JOIN closure AS p ON (p.d = d.tsn AND p.l = 1) WHERE a.tsn = ? AND c.l <= ? ORDER BY c.l;
Une fois les résultats de la requête récupérés, nous pouvons les traiter pour créer une structure de tableau hiérarchique. Cela implique de trier les lignes par hiérarchie et de les regrouper en conséquence, en créant un tableau avec des nœuds en tant qu'objets avec à la fois des données et des tableaux enfants.
Pour améliorer la structure du tableau, nous pouvons créer Objets Row personnalisés qui contiennent un tableau associatif de données de ligne ainsi qu'un objet Rowset pour leurs enfants. L'ensemble de lignes enfants pour les nœuds feuilles est vide.
Les classes personnalisées peuvent également inclure des méthodes telles que toArrayDeep() qui convertissent de manière récursive leur contenu de données en un tableau simple, permettant ainsi une exportation facile des données. .
Pour utiliser ce système, on peut d'abord obtenir une instance de la passerelle de données de table de taxonomie, puis récupérer la structure arborescente souhaitée :
// Get an instance of the taxonomy table data gateway $tax = new Taxonomy(); // Query tree starting at Rodentia (id 180130), to a depth of 2 $tree = $tax->fetchTree(180130, 2); // Dump out the array var_export($tree->toArrayDeep());
Pour déterminer la profondeur de chaque chemin, vous pouvez insérer de nouveaux nœuds dans la table de fermeture, en calculant le niveau approprié en fonction de l'endroit où ils sont ajoutés dans la hiérarchie. La fonction LAST_INSERT_ID() peut être utile pour obtenir l'ID des nœuds nouvellement insérés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!