Un article de Mmmm!!!

Structure arborescente dans PHP

Cet article souhaite vous montrer comment realiser une structure arborescente en PHP à partir des tableaux PHP ( hashtable ). Effectivement dans php il n'y a pas en natif de structure arborescente. Il est possible de la créer via des objects ( classes PHP ). C'est peut etre la bonne methode bien rigoureuse. Cependant je souhaiterais vous entretenir d'une autre méthode plus souple moins rigpoureuse et facilement implemetable. Cette technique n'est pas specifique a php mais peut etre aussi appliquer à Tcl/Tk.

L'idée vient du fait que l'on a des hashtables dans lesquelle on peut inserer toutes sortes d'object dont des hashtables.

Il est impérative que l'on puisse faire un introspection sur le type de l'object contenu dans la hashtable, ceci est possible avec le langage PHP grace a la fonction is_array ( attention elle n'est presente que dans les version supérieur ouéegal a PHP 3.0.16 et PHP4 ).

Effectivement on peut considérer un arbre tel une liste de noeud contenant soit une feuille ou une autre liste de noeud. Bon, c'est la ou cette technique est interressante car on ne se limite pas a un type d'arbre ( binaire ... ). De plus on peut facilement faire une structure etant une collection d'arbre , c'est a dire un arbre avec plusieur racine.

Il est evident que je ne cherche pas ici a appliquer a ces arbres structurer ainsi les algorythmes classique sur les arbres ( algo sur arbre binaire par exemple : Binary Search Tree ou DSW Algorithm ).

Je fais un peu de bla bla histoire ne peut vous forger de suite ma petit routine dont je suis content beatement et certaiment betement content tel l'informaticien atteingnant un orgasme spirituel lorsqu'il a réussi à sur bouger un point sur son écran. Remarquez que pendant des années des gens appele demomarker etaient dans cette phase lorsqu'ils voyaient bouger des boules sur un tube cathodique. C'est Freudien non ? :).

Passons à mon orgasme spirituel (pauvre de moi :)

Nous allons premierement créer les données arborescentes en créant un tableau pouvant contenir des tableaux et des feuilles ( chaine de caracteres ).

        $arraytree=array("Racine"=>array("Branche 1"=>array("Sous Branche1"=>"Feuille 1","Sous Branche 2"=>"Feuille 2"),"Branche2"=>"Feuille 3"));

La fonction permettant d'afficher :


function addtree ($father, $array) {
        echo "<ul>\n";
       while ( list ($tag,$value) = each ($array) ) {
                if ( is_array($value)==TRUE) {
                        echo "<li>$father -> $tag noeud<br>\n";
                        addtree($tag,$value);
                        } else {
                        echo "<li>$father -> $tag : $value<br>\n";
                        }
                }
        echo "</ul>\n";
        }
Voici le resultat:

J'avance d'un echelon dans mon plaisir pour la programmation.Mais quand on a commence on ne peux plus s'arreter. Allez hop , je me dis est- ce que je peux afficher une collection d'arbres.
        $arraytree=array("Home"=>"toto","News"=>array("This Day"=>"titi","This Week"=>"tata"),"Link"=>"tutu");
Representant l'arborescense suivante:
Home -> toto
News -\
      |
      |_ This Day -> titi
      |_ This Week -> tata
Link -> tutu
He bien ca le fait:

Faisons de l'utile si possible


Ma reflexion fut fort simple : a quoi bon, afficher des toto et des titi dans des noeuds Home. Ok ok ok, je le fais en appelant une fonction recursive avec en parametre une hashtable. Mais les personnes lisant ce document vont se dire :" Bien mais a quoi cela peut me servir a moi , dont le patron ce fout des fonctions recursives et meme qui ne sait meme pas ce que c'est .... ".

La premiere utilite que je vois est l'affichage de liens, un peu comme un bookmark.
        $arraytree=array("Home de Mmmm"=>"http://mmmm.free.fr","Autres liens"=>array("Mmmm"=>"http://mmmm.free.fr","Apodéline"=>"http://apodeline.free.fr"),"Cette page"=>"#");
En modifiant un peu addtree:
                        echo "<li>$father -> $tag : $value<br>\n";
Devenant
                        echo "<li>$father -> <a  href =\"$value\">$tag </a><br>\n";
On obtient:
Super. Mais c'est un peu crétin de maintenir un bookmark en dur dans le code PHP :). C'est la ou l'on se dit qu'il existe le principe de Base de donnée, et en plus cela tombe plutot bien car php a un couplage fort avec un grand nombre de base de donnée par exemple MySql. Cependant la création d'une base de donnée de bookmark avec gestion par php dépasse un peu le cadre de cette article.

Le pied integral


C'est bien joli tout cela, mais les listes c'est plutot moche.
Pour rendre le bidulle plus joli, nous allons voir comment utiliser la librairie javascript permettant de realiser un arbre. Nous avons utiliser le code javascript present dans le lien suivant.

Utilisation d'un object graphique arbre en javascript
J'ai peux apprecier la facilite de la librarie de smith ce qui m'a permis de l'integrer a un projet en PHP.

L'utilisation de la generation du javascript en php n'est pas facile car il faut (ou il vaut mieux) ecrire le code javascript dans le HEADER du document HTML.

La difficulté avec javascript est de générer des scriptes dynamiques en fonction par exemple du contenu d'une base de donnée. Cependant pour certaines personnes dont moi , je preferre manipuler du PHP plutot que du javascript.


Bon essayons de mettre en application la librarie javascript avec la méthodologie expliquée ci-dessus.
Voici le resultat pour un tableau contenant :
  $arraytree=array("Home de Mmmm"=>"http://mmmm.free.fr","Autresliens"=>array("Mmmm"=>"http://mmmm.free.fr","Apodéline"=>"http://apodeline.free.fr"),"Cette page"=>"#");
et le code source de la page.
Evitez les numéros en debut des keys ainsi que les espaces.chop ne voulant pas marcher :(

conclusion

Passer par un hashtable permet un polymorphisme de vos donnees. Cette technique est tres souple mais pas forcement tres rigoureuse.
Pour tout commentaire, suggestion, et autre recette de cuisine voir bon resto , ecrivez moi.


L'equipe de Mmmm!!! copyright 2000