Supposons que vous ayez une table plate qui stocke une hiérarchie d'arbre ordonnée:
Id Name ParentId Order
1 'Node 1' 0 10
2 'Node 1.1' 1 10
3 'Node 2' 0 20
4 'Node 1.1.1' 2 10
5 'Node 2.1' 3 10
6 'Node 1.2' 1 20
Voici un diagramme, où nous en avons [id] Name. Le nœud racine 0 est fictif.
[0] RACINE
/ \
[1] Nœud 1 [3] Nœud 2
/ \ \
[2] Noeud 1.1 [6] Noeud 1.2 [5] Noeud 2.1
/
[4] Noeud 1.1.1
Quelle approche minimaliste utiliseriez-vous pour produire cela en HTML (ou texte, d'ailleurs) sous la forme d'un arbre correctement ordonné et correctement en retrait?
Supposons en outre que vous n'avez que des structures de données de base (tableaux et hashmaps), pas d'objets fantaisistes avec des références parent / enfants, pas d'ORM, pas de framework, juste vos deux mains. Le tableau est représenté comme un ensemble de résultats, auquel on peut accéder de manière aléatoire.
Le pseudo-code ou l'anglais simple est correct, c'est une question purement conceptuelle.
Question bonus: Existe-t-il un moyen fondamentalement meilleur de stocker une structure arborescente comme celle-ci dans un SGBDR?
MODIFICATIONS ET ADDITIONS
Pour répondre à la question d'un intervenant ( Mark Bessey ): Un nœud racine n'est pas nécessaire, car il ne sera jamais affiché de toute façon. ParentId = 0 est la convention pour exprimer "ce sont des niveaux supérieurs". La colonne Ordre définit comment les nœuds avec le même parent vont être triés.
Le "jeu de résultats" dont j'ai parlé peut être décrit comme un tableau de hashmaps (pour rester dans cette terminologie). Car mon exemple était censé être déjà là. Certaines réponses vont plus loin et le construisent d'abord, mais ça va.
L'arbre peut être arbitrairement profond. Chaque nœud peut avoir N enfants. Cependant, je n'avais pas exactement une arborescence de "millions d'entrées" en tête.
Ne confondez pas mon choix de nom de nœud ('Node 1.1.1') avec quelque chose sur lequel compter. Les nœuds pourraient également être appelés «Frank» ou «Bob», aucune structure de dénomination n'est impliquée, c'était simplement pour la rendre lisible.
J'ai publié ma propre solution pour que vous puissiez la mettre en pièces.