begin process at 2012 05 27 16:48:45
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > ARBORESCENCE RÉCURSIVE

ARBORESCENCE RÉCURSIVE


 Information sur la source

Note :
8,14 / 10 - par 7 personnes
8,14 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Niveau :Initié Date de création :16/04/2005 Date de mise à jour :16/04/2005 13:32:32 Vu :8 491

Auteur : titatou

Ecrire un message privé
Site perso
Commentaire sur cette source (19)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce code n'est pas de moi, mais puisqu'il me sert énormément et que je n'ai pas trouvé de code de ce type sur phpcs, je le livre. Il sert à mettre en forme à partir de données tabulaires (contenues dans un tableau) une arborescence. Le tableau ne nécéssite que deux champs obligatoires : l'ID de l'objet, et l'ID de l'objet parent. Le code génère une arborescence illimitée multiniveaux. On peut modifier le code assez facilement pour y intégrer les résultats d'une base mysql par exemple... Le code est commenté.

Source

  • <?php
  • /*cette fonction gère le décallage des éléments
  • suivant leur position dans l'arborescence
  • */
  • function espace($rang)
  • {
  • $ch= '';
  • for ($x=0;$x<$rang;$x++)
  • {
  • $ch.= '&nbsp;&nbsp;&nbsp;&nbsp;';
  • }
  • return $ch;
  • }
  • /*fonction récursive d'affichage de l'arbre
  • $tab :tableau des éléments
  • $pere :index de l'élément courrant
  • $rang :décallage de l'élément
  • */
  • function recur($tab,$pere,$rang)
  • {
  • //ballayage du tableau
  • for ($x=0;$x<count($tab);$x++)
  • {
  • //si un élément a pour père : $pere
  • if ($tab[$x][1]==$pere)
  • {
  • //on l'affiche avec le décallage courrant
  • echo espace($rang),$tab[$x][2],'<BR />',"\n";
  • /*et on recherche ses fils
  • en rappelant la fonction recur()
  • (+ incrémentation du décallage)*/
  • recur($tab,$tab[$x][0],$rang+1);
  • }
  • }
  • }
  • /*-------------------- MAIN -----------------------
  • tableau des éléments de l'arbre:
  • c'est un tableau à 2 dimensions.
  • Une ligne représente un élément : data[$x]
  • chaque ligne est décomposée en 3 données:
  • - l'index de l'élément
  • - l'index de l'élément parent
  • - la chaîne à afficher
  • ie: data[]= array (index, index parent, chaine )
  • */
  • //il faut d'abord déclarer un élément racine de l'arbre
  • $data[] = array(0,-1,'racine');
  • //puis tous les éléments enfants
  • $data[] = array(1,0,'BOISSONS');
  • $data[] = array(2,0,'ALIMENTS');
  • $data[] = array(3,1,'Alcool');
  • $data[] = array(4,1,'Sans alcool');
  • $data[] = array(5,2,'Legumes');
  • $data[] = array(6,5,'salades');
  • $data[] = array(7,6,'batavia');
  • $data[] = array(8,6,'laitue');
  • $data[] = array(9,5,'carottes');
  • $data[] = array(10,5,'tomates');
  • $data[] = array(11,2,'viandes');
  • $data[] = array(12,11,'Jambon');
  • $data[] = array(13,11,'steack haché');
  • $data[] = array(14,0,'DIVERS');
  • $data[] = array(15,14,'Dentifrice');
  • $data[] = array(16,14,'sacs poubelles');
  • $data[] = array(17,14,'lessive');
  • $data[] = array(18,3,'biere');
  • $data[] = array(19,3,'porto');
  • $data[] = array(20,4,'eau');
  • //appelle de la fonction récursive (amorce)
  • //avec recherche depuis la racine.
  • recur($data,0,0);
  • ?>
<?php
/*cette fonction gère le décallage des éléments
     suivant leur position dans l'arborescence
*/
function espace($rang) 
	{
    $ch= '';
    for ($x=0;$x<$rang;$x++) 
		{
		$ch.= '&nbsp;&nbsp;&nbsp;&nbsp;';
		}
	return $ch;
	}

/*fonction récursive d'affichage de l'arbre
    $tab    :tableau des éléments
    $pere :index de l'élément courrant
    $rang :décallage de l'élément
*/
function recur($tab,$pere,$rang) 
	{
    //ballayage du tableau
    for ($x=0;$x<count($tab);$x++) 
		{
		//si un élément a pour père : $pere
		if ($tab[$x][1]==$pere) 
			{
			 //on l'affiche avec le décallage courrant
			 echo espace($rang),$tab[$x][2],'<BR />',"\n";
	
			 /*et on recherche ses fils
			 en rappelant la fonction recur()
			 (+ incrémentation du décallage)*/
			 recur($tab,$tab[$x][0],$rang+1);
			}
		}
	}
/*-------------------- MAIN -----------------------
    tableau des éléments de l'arbre:
    c'est un tableau à 2 dimensions.
    Une ligne représente un élément : data[$x]
    chaque ligne est décomposée en 3 données:
        - l'index de l'élément
        - l'index de l'élément parent
        - la chaîne à afficher
    ie: data[]= array (index, index parent, chaine )
*/
    //il faut d'abord déclarer un élément racine de l'arbre
    $data[] = array(0,-1,'racine');

    //puis tous les éléments enfants
    $data[] = array(1,0,'BOISSONS');
    $data[] = array(2,0,'ALIMENTS');
    $data[] = array(3,1,'Alcool');
    $data[] = array(4,1,'Sans alcool');
    $data[] = array(5,2,'Legumes');
    $data[] = array(6,5,'salades');
    $data[] = array(7,6,'batavia');
    $data[] = array(8,6,'laitue');
    $data[] = array(9,5,'carottes');
    $data[] = array(10,5,'tomates');
    $data[] = array(11,2,'viandes');
    $data[] = array(12,11,'Jambon');
    $data[] = array(13,11,'steack haché');
    $data[] = array(14,0,'DIVERS');
    $data[] = array(15,14,'Dentifrice');
    $data[] = array(16,14,'sacs poubelles');
    $data[] = array(17,14,'lessive');
    $data[] = array(18,3,'biere');
    $data[] = array(19,3,'porto');
    $data[] = array(20,4,'eau');

    //appelle de la fonction récursive (amorce)
    //avec recherche depuis la racine.
    recur($data,0,0);

?>

 Conclusion

Je trouve ce code fantastique ! Il est très simple, et peut générer une arborescence avec des sous niveaux infini, il n'a aucune limite et est adaptable à l'infini !
Ce script est de Christophe GORGERY, il a été trouvé sur son site http://desperaweb.com.


 Historique

16 avril 2005 02:36:59 :
16 avril 2005 13:30:39 :
Suite aux commentaire, j'ai modifié le code original. Est-ce que cela vous va comme cela?
16 avril 2005 13:32:32 :
Oops, un petit souci de mise en forme...

 Sources de la même categorie

Source avec une capture MODULE JOOMLA 1.5 NOW LISTENING par Alcantornet
Source avec Zip Source avec une capture UPLOAD CENTER par basssem81
Source avec Zip COMPTEUR DE CLIQUE PHP AVEC JQUERY par devgoneti
Source avec Zip LIVRE D'OR SIMPLE (POUR DÉBUTANT) par devgoneti
Source avec Zip SCRIPT TRAVAUX POUR VOTRE SITE par FleuryK

Commentaires et avis

Commentaire de malalam le 16/04/2005 10:47:23 administrateur CS

Bah, s'il t'a aide tant mieux :-)
Mais c'est mal ecrit...tres mal. Que ce soit le peu de html, ou le php.

Commentaire de JoJo738 le 16/04/2005 11:11:12

Lu, encore moi.
Pas mal
Euh :
  - Priviligie les ' aux "
  - Des , et pas des . dans les echo
  - Un code XHtml de preference ( <br /> ... )
  - Et plus simpl que $var = $var . ' + ca'; => $var .= ' + ca';

Commentaire de titatou le 16/04/2005 13:06:09

Malalam tu m'avances beaucoup (si tu pouvais proposer des choses concrètes...).....
Jojo738, tu peux m'expliquer quel est la différence entre tout ce que tu me dis, je comprends pas en quoi c'est important, j'ai du louper un train....quand au xhtml a la place de l'html, a ce que je sache les sites sont bien fais en html non?

Commentaire de JoJo738 le 16/04/2005 13:11:40

Alors :
  - ' et pas " pour une question de rapidité
  - , et pas ', aussi pour cette meme question
  - Oui, les sites sont en html, mais ... bientot ... Ils seront tous au XHtml, le XHtml est le language de demain. Donc il est preferable de poster un code XHtml pour les codeurs qui n'auront pas besoin de cette maniere de refaire tout leur site aux normes

Commentaire de titatou le 16/04/2005 13:20:34

oui, mais le xhtml est-il compatible actuellement avec tous les navigateur?
Et, je ne comprends toujours pas pour la question de rapidité : tu parles de la rapidité d'exécution? Je ne savais pas que la concaténation pouvait se réaliser avec des virgules...Je te remercie de ta participation, tu m'apprends plein de choses !

Commentaire de JoJo738 le 16/04/2005 13:25:58

Oups, me suis gouré !!

  - , et pas . aussi pour cette meme question ( seulement dans les echo )
  - et $var .= 'ajout';

Le XHtml, Oui, si tu respecte à la lettre. XHtml/Css

Commentaire de titatou le 16/04/2005 13:34:20

Bon, j'ai modifié le code, mais il me reste une question : lorque je souhaite faire une ligne dans mon fichier html généré, je met \n, mais cela ne fonctionne que si je l'entoure de " (doubles quotes).

Commentaire de JoJo738 le 16/04/2005 13:36:09

Alors :
- 'texte', "\n"; dans un echo
- 'texte' . "\n"; dans une variable
Mais tu n'est pas obligé de le faire ... Mais c'est plmus lisible
Moi je fais aussi lorsque je nais pas de " a l'interieur :
- "<div>\nMon texte</div>";

Commentaire de Jayadeva le 17/04/2005 11:28:46

Question compatibilitée xHTML, seul IE est pas aux normes. Je crois...

Commentaire de JoJo738 le 17/04/2005 12:27:08

Comme dab quoi ...
On dit meci à qui ?
Bin, à mikrosft ... +o(

Commentaire de malalam le 17/04/2005 14:52:47 administrateur CS

Hello,

oui je peux.

Par exemple, pas de count() dans une boucle for().
La raison est simple : la boucle for() evalue la condition qu'on y place a l'interieur a chaque iteration.
Si on sort le count(), on evalue juste 2 variables, ce qui est nettement plus performant.
$nbr = count($tablo);
for ($i = 0; $i < $nbr; $i ++) {
}

je continuerai demain, la je dois partir. Pour le html Jojo a deja repondu, je m'attelerai au php.

Commentaire de JoJo738 le 17/04/2005 15:07:15

> Est-ce que cela vous va comme cela? :p Oui, c'est beaucoup mieux !
Sinon je vois un <BR />, c'est presque ça .... On doit mettre les balises X/Html en minuscules : <br />
Sinon il ne reste que le count() à reglé.

Ah aussi, une methode que je priviligie : le foreach()

function recur($tab,$pere,$rang)  {
  //ballayage du tableau
  foreach( $tab as $x )  {
    //si un élément a pour père : $pere
    if ($x[1]==$pere)  {
      //on l'affiche avec le décallage courrant
      echo espace($rang), $x[2], "<br />\n"; // la tu peux faire "balise\n"
    
      /*et on recherche ses fils en rappelant la fonction recur() (+ incrémentation du décallage)*/
      recur($tab, $x[0], $rang+1);
    }
  }
}

Commentaire de malalam le 18/04/2005 15:32:54 administrateur CS

Interessant article sur les navigateurs...et les mauvaises langues en seront pour leurs frais ;-)

http://www.openweb.eu.org/articles/navigateurs_alternatifs/

Commentaire de coucou747 le 19/04/2005 00:02:38 administrateur CS

t'as une partie de conneries dans ce lien !!!
Mozilla ne propose pas gecko ! gecko interprète mozilla ! Mozilla est fait en XUL, RDF et javascript ! gecko interprète ce style de pages !

ensuite, parler de desktop pour un environement linux, c'est déplacé... pour qualifier KDE, on doit employer gestionnaire de fenêtres, pas desktop (mot qualifiant l'environement graphique de windows...) car sous KDE, on a par défaut 4 desktop (on peut en mettre bcp...)

ensuite, "\n" doit être remplacé par :
'
'

c'est bcp plus rapide...

tu devrais plutot utiliser le principe des abrbres du C (en C, on fait une struct, la tu dois faire une class php5) ça serait plus joli comme code...

Commentaire de malalam le 19/04/2005 09:25:12 administrateur CS

On a pas lu le meme article lol...

Commentaire de coucou747 le 19/04/2005 12:10:18 administrateur CS

http://www.openweb.eu.org/articles/navigateurs_alternatifs/

"Originellement en anglais," => la quasi totalitée des logiciels open source ont étés traduis... donc, ce n'est plus une remarque notable...

dans le paragraphe sur mozilla firefox : "utilise une version optimisée du coeur de son ainé"=>non, c'est le même coeur... gecko...

"et remplacer à terme Mozilla."=> pour les dévelopeurs, c'est déja fait : mozilla n'est plus dévelopé, contrairement à firefox...

"Konqueror
Navigateur par défaut des distributions Linux tournant sous le Desktop KDE, " remarque que j'ai faite pour le nom desktop...

"Konqueror a aussi la particularité d'être un outil de gestion de fichiers"=> comme IE (mozilla et ses dérivés ne font que read only...)

"KHTML, le moteur de navigation Open-Source de Konqueror,"=> c'est celui utilisé par konqueror, mais c'est celui de QT...

"Frère presque jumeau de Mozilla, Netscape 7.0 est la version grand public de ce dernier."=> jumeau... c'est la version payante à l'origine...

"Gecko est en fait la technologie qui affiche les pages web (il comprend et supporte les normes (X)HTML, JavaScript, DOM, CSS, XML?)."=> ajoutes RDF, XUL...

ils ont oublié fireox dans les navs qui utilisent gecko...
ils ont oublié de dire que ces navigateurs étaient fait en XUL/RDF/javascript, donc que chacun était capable de le modifier... (enfin, prèsque...) que les extentions sont nombreuses, et faciles à réaliser... Connaissez vous un navigateur qui possède plus d'extentions que Mozilla Firefox ? (La façon d'intègrer les extentions entre tt les navigateurs gecko est légèrement diférente, alors certaines ne marchent pas sous Mozilla... Mais en les modifiant un peu, on devrait pouvoir régler ça...)


Voila la critique de ton lien... Le comparatif est incomplet... Ils ne parlent même pas des extentions, et des normes non respectés...

Commentaire de malalam le 19/04/2005 12:31:25 administrateur CS

Je crois que tu n'as pas compris le but de l'article.
Ce n'est pas un article visant a vanter les merites de tel ou tel navigateur, quel est le meilleur, quelles sont leurs fonctionnalites etc...alors les precisions, on 'en fiche un peu.
Il s'agit juste d'une liste non exhaustive (comme toutes les listes a terme...) des navigateurs supportant PLUTOT bien les standards web. Voila tout.
S'il y a des raccourcis, ca ne pose pas de probleme sur le fond de l'article. Personnellement, je me fiche totalement de ce que supporte ou non Konqueror en lisant cet article si ca n'a aucun rapport avec un standard W3C...et XUL n'en est pas un. (X)HTML, CSS, DOM, et meme javascript par DOM, XML en sont.

Je ne vais pas reprendre tes points un par un...je veux juste te montrer que ce que tu apportes ne sont que des details qui n'ont rien a faire dans cet article, puisque ce n'est pas son sujet. Les imprecisions, raccourcis ne sont pas tres graves dans ce cadre-ci. Si je veux des details sur Konqueror, j'irai lire un article ecrit pour m'en donner. La je voulais juste avoir une liste des navigateurs respectant le mieux les standards web.

Commentaire de marcel1307 le 12/01/2008 23:33:36 9/10

Je cherchais cet algo depuis 2 semaines ! J'y arrivait pas :p C'est pourtant tout con... J'en ai honte.
Par contre l'utiliser avec une ressource mysql... j'y arrive pas trop. Quelqu'un aurait-il une idée?

Commentaire de Scorpio2201 le 05/06/2008 12:00:26

salut
J'ai modifier ton code pour qu'il puisse me satisfaire totalement car j'utilise une base de données pour remplir mes branches. merci à toi pour ton code
Il me reste à le modifier en lui ajoutant du javascript pour pouvoir enrouler les branches.
si quelqu'un aurait une piste...
MERCI a bientôt

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,421 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales