Bonjour,
Premièrement tu pars d'une basse de données donc par définition un tableau 2D en sortie! Mais il y a plusieurs façon de voir la base de données et pas uniquement 2D.
Pour résoudre ton problème, je vois Trois axes possibles et je suis persuadé qu'il y en aura autant que de personnes qui souhaitent répondre.
1- 2 étapes:
On peut voir la sortie de la base de données par requete , comme un tableau 2D. Une fonction va traiter le tableau 2D pour en faire un Arbre PHP. Un arbre PHP n'est rien d'autre qu'un tableau multidimmension.
Ex d'arbre PHP:
Code PHP :
$arbre["racine"]=array();
$arbre["racine"]["noeud1"]=array("feuille"=>1);
$arbre["racine"]["noeud2"]=array("noeud 2.1"=>array("feuille"=>1), "noeud 2.2"=>array("feuille"=>1), "noeud 2.3"=>array("noeud2.3.1"=>array("feuille"=>1)));
En bref, découper en fonction de l'indice pour créer un tableau multidimensionnel, on entre avec $lst (tableau issu de la requete) et $sep le séparateur, si on souhaite en changer juste ce param est à changer:
Code PHP :
function 2DtoTree($lst, $sep)
{
$out=array();
foreach ($lst as $k=>$v)
{
$indices= explode($sep, $k);
$treeTxt="$out";
foreach($indices as $ind)
{
$treeTxt.="[".$ind."]";
}
$treeTxt.="=".$v;
eval($treeTxt);
}
return $out;
}
{Code non testé}
Method pas super Elegante mais très efficace qui cree les node du tableau en mode text le tableau et qu'il le fait évaluer. Ensuite on a un arbre, qui marche en récursif avec le test d'arret "is_array($out)"
2- BDD récursive
Le concept est différent, il partir du principe que l'on interrogera la base de données par niveau en mode récursif. On entre dans la fonction avec les indices de premier niveau (SELECT * FROM TABLE WHERE IND NOT LIKE '%.%'), ensuite à chaque passage récursif, on teste la condition d'arret:
SELECT * FROM TABLE WHERE IND LIKE '$indCur.%', si des enregistrements sont renvoyé on entre récursion, sinon on s'arrête.
3- Itératives
L'idée en itératif sera de savoir quand on ferme les UL, LI et savoir quand on les ouvres.
Je propose de passer en revue la liste avec un foreach par exemple (un while marchera aussi) et en fait on va compte le nombre de séparateur (ici '.'). Si le nombres de séparateur courant ($nbSepCur) soustrait du nombre de séparateur précédent ($nbSepOld) => ($nbUL=$nbSepCur-$nbSepOld, normalement si la base est bien triées) est positive alors j'ajoute autant de UL que cette différence ($nbUL), si elle est négative j'ajoute autant de /UL que cette différence, sinon on en ajoute pas.
Puis à chaque passage de boucle <li>$val</li>
Bon courage!
______oOOO________OOOo________
RaftY, du code C commode!