Une arborescence.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 120 fois - Téléchargée 18 fois

Contenu du snippet

il existe deux facons de faire une arborescence, la naive, et l'autre.

pre-requis :
http://sqlpro.developpez.com/cours/arborescence/

je propose ici, quelques fonctions en php, qui permettent d'utiliser de facon simple, et en mysql4, ce qui est explique dans le tuto (suite a un bloquage sur le forum, j'ai decide de recoder ca).

on peut donc ajouter dans l'arborescence, supprimer un element, ou supprimer un element et les sous-branches. les fonctions d'affichages sont aussi fournies (d'ailleur, elles sont en mode debug).

c'est fait juste pour illustrer le tuto, normalement, on devrais en faireu ne class php5, voir une abstract class + deux implementations, enfin j'ai pas trop reflechi au schemat, mais c'etait pas vraiment le but de la source...

Source / Exemple :


<?php
// http://sqlpro.developpez.com/cours/arborescence/
mysql_connect(............) or die(mysql_error());
mysql_query('CREATE DATABASE IF NOT EXISTS tests') or die(mysql_error());
mysql_query('USE tests') or die(mysql_error());

function array_top($s){
	$top=array_pop($s);
	array_push($s, $top);
	return $top;
}

//MODELE 1 D'ARBO :

//creation de la table
mysql_query('CREATE TABLE IF NOT EXISTS arbo1(
	id 	INT UNSIGNED AUTO_INCREMENT,
	nom	VARCHAR(100),
	id_parent INT UNSIGNED,
	PRIMARY KEY(id))
') or die(mysql_error());

//ici, les insertions se font naturellement. Exemple
//mysql_query('INSERT INTO arbo1(nom, id_parent) VALUES ("parent", 0), ("enfant1", 1), ("enfant2", 1), ("enfant de enfant1", 2), ("enfant de enfant 2", 3) ') or die(mysql_error());

//mais la fonction d'affichage est recursive...
function affArbo1($id=0){
	echo '<ul>';
	$r=mysql_query('SELECT id, nom FROM arbo1 WHERE id_parent='.$id) or die(mysql_error());
	while($data=mysql_fetch_assoc($r)){
		echo '<li>'.$data['nom'];
		affArbo($data['id']);
		echo '</li>';
	}
	echo '</ul>';
}
//affArbo1();

// MODELE 2 D'ARBO

//mysql_query('DROP TABLE arbo2');
// creation de la table
mysql_query('CREATE TABLE IF NOT EXISTS arbo2(
	id 	INT UNSIGNED AUTO_INCREMENT,
	nom	VARCHAR(100),
	poidG INT UNSIGNED,
	poidD INT UNSIGNED,
	PRIMARY KEY(id))
') or die(mysql_error());
// insertion dans la racine
//mysql_query('INSERT INTO arbo2(nom, poidG, poidD) VALUES ("parent", 0, 1) ') or die(mysql_error());
// fonction d'ajout dans l'arbo : on ajoute sous l'id $id, avec le nom $nom.
function addInArbo2($id, $nom){
	$req=mysql_query('SELECT poidD FROM arbo2 WHERE id='.$id) or die(mysql_error());
	$poidD=mysql_fetch_row($req);
	if ($poidD===false) throw new Exception('id invalide');
	$poidD=$poidD[0];

	mysql_query('UPDATE arbo2 SET poidD=poidD+2 WHERE poidD >= '.$poidD) or die(mysql_error());
	mysql_query('UPDATE arbo2 SET poidG=poidG+2 WHERE poidG > '.$poidD) or die(mysql_error());

	mysql_query('INSERT INTO arbo2(nom, poidG, poidD) VALUES("'.$nom.'", '.($poidD).', '.($poidD+1).')') or die(mysql_error());
}

/*
addInArbo2(1, 'enfant');addInArbo2(1, 'enfant');addInArbo2(1, 'enfant');
addInArbo2(2, 'enfant');addInArbo2(2, 'enfant');addInArbo2(2, 'enfant');
addInArbo2(3, 'enfant');addInArbo2(3, 'enfant');addInArbo2(4, 'enfant');

  • /
// suppression de l'element $id. (les sous menus prennent la place de l'element.) function dellArbo2($id){ $req=mysql_query('SELECT poidG, poidD FROM arbo2 WHERE id='.$id) or die(mysql_error()); $poidG=mysql_fetch_assoc($req); if ($poidG===false) throw new Exception('id invalide'); $poidD=$poidG['poidD']; $poidG=$poidG['poidG']; mysql_query('DELETE FROM arbo2 WHERE id='.$id) or die(mysql_error()); mysql_query('UPDATE arbo2 SET poidD=poidD+1, poidG=poidG+1 WHERE poidD < '.$poidD.' AND poidG > '.$poidG) or die(mysql_error()); mysql_query('UPDATE arbo2 SET poidG=poidG-2 WHERE poidG >= '.$poidG) or die(mysql_error()); mysql_query('UPDATE arbo2 SET poidD=poidD-2 WHERE poidD >= '.$poidG) or die(mysql_error()); } // suppression de l'element $id, et de tout les sous menu. function delAllSub2($id){ $req=mysql_query('SELECT poidG, poidD FROM arbo2 WHERE id='.$id) or die(mysql_error()); $poidG=mysql_fetch_assoc($req); if ($poidG===false) throw new Exception('id invalide'); $poidD=$poidG['poidD']; $poidG=$poidG['poidG']; mysql_query('DELETE FROM arbo2 WHERE poidD<='.$poidD.' AND poidG>='.$poidG) or die(mysql_error()); mysql_query('UPDATE arbo2 SET poidG=poidG-'.($poidD-$poidG+1).' WHERE poidG >= '.$poidG) or die(mysql_error()); mysql_query('UPDATE arbo2 SET poidD=poidD-'.($poidD-$poidG+1).' WHERE poidD >= '.$poidD) or die(mysql_error()); } // affichage de l'arbo 2. function affArbo2(){ echo '<ul>'; $r=mysql_query('SELECT id, nom, poidD, poidG FROM arbo2 ORDER BY poidG') or die(mysql_error()); $l=0; $stack=array(); while($data=mysql_fetch_assoc($r)){ do { $top=array_top($stack); if ($top===null || $top>$data['poidG']+1){ break; }else { echo '</ul>'; array_pop($stack); } } while(true); echo '<li>'.$data['nom'].' : [ '.$data['poidG'].', '.$data['poidD'].'] ->'.$data['id']; if ($data['poidD']==$data['poidG']+1) echo '</li>'; else{ echo '<ul>'; array_push($stack, $data['poidD']); } } echo '</ul>'; } //dellArbo2(2); //delAllSub2(2); affArbo2(); ?>

Conclusion :


pour tester, vous devrez de-commenter quelques lignes (les insertions, etc...)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
mardi 22 mars 2005
Statut
Membre
Dernière intervention
10 janvier 2009

Le script fonctionne super bien par contre au lieu de faire des listes avec et <li> serait-il possible de faire des sauts de ligne et des espaces entre les cat?gories (dans le but de mettre des images ? la place) ?

Exemple :
Cat1
ss Cat1
sss cat
Cat2 etc...

Je ne vois pas la solution... Merci
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
Coucou, je suis parfaitement d'accord avec toi pour dire que le xml serait plus gourmand en ressource que le sql, mais dire que c'est plus simple, à mon avis ca va dépendre de la structure de ta base.
En effet, le xml étant déjà structuré comme un arbre, sa compréhension est directe.

Mais apres c'est clair, ya pas photos, sur un site avec des serveurs décentralisés, le sql sera la meilleure méthode !
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
30
t'as parfaitement raison codefalse, mais tu traites plus facilement du sql que du xml... et avec moins de ressources... enfin, c'est pas du tout le meme genre de choses, genre imagine sur CS, t'as pas qu'un seul serveur, donc avoir du sql, c'est mieux que des fichiers...

fhx, l'idee de mettre ton xml en sql, ca veut dire que pour traiter ton xml, tu dois appeller mysql ou autre puis traiter ton xml avant de pouvoir faire tes modifs, puis remettre tout ca en mysql... c'est franchement lourd comme methode...
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
ouah ! Fhx ! Ca faisait un moment :p

Bon je dirai que je suis d'accords pour le fait que le xml s'approche plus de la notion d'arborescence vu que C'EST de l'arborescence :p Apres Sql, ce sera de l'arbo abstraite, puisqu'il faudra construire son arbre en bien pensant sa requete !

Apres, c'est mon avis ! :p
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
30
fhx, en sql, ca implique de parser ton xml...
Afficher les 17 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.