TechnologieRSS: News Maker

Supporter des structure de données parents/enfants

Posté le 1 mai 2009 dans: Technologie

Aujourd’hui les enfants je vais vous montrer comment généré une liste avec des enfants à l’infinie.

Dans la base de donnée, nous avons ce style de donnée:

ID	PARENT_ID	TEXT
1	0		test
2	1		sous-test
3	0		nouveau test
4	2		sous-sous-test
5	1		sous-test 2

Comme vous pouvez voir, la structure est très simple. Nous avons nos entrées avec leurs titres, et dans la colonne PARENT_ID nous avons les références qui pointent sur leurs parents.

Un fois généré la structure HTML ressemblera à ceci:

  • test
    • sous-test
      • sous-sous-test
    • sous-test 2
  • nouveau test

Alors, allons-y! Vous remarquerez évidement que comme à l’habitude j’utilise symfony comme framework.

NB: Il est bien facile à voir que j’utilise Propel pour rejoindre et manipuler ma base de donnée. Si vous utilisez tout simplement des requêtes MySQL hardcodé vous pouvez traduire mon code à votre aise!

$c = new Criteria();
 
//Je vais chercher tout les donnée que ma db contient:
$todo = TodoPeer::doSelect($c);
 
//Ensuite je créer des arrays qui contiendront l'arborescence de mes données
$refs = array(); $list = array();
//Je fais passé les résultats de ma requête dans un foreach qui compilera mon array
foreach ($todo as $data) {
	//J'entre les premières données dans l'array
	$thisref = "$refs[ $data->getId() ];
	$thisref['parent_id'] = $data->getParentId();
	$thisref['name'] = $data->getTitle();
	//Je vérifie si l'entrée a des enfants.
	if ($data->getParentId() == 0) {
		//Si non j'entre l'entrée au premier niveau.
		$list[ $data->getId() ] = "$thisref;
	} else {
		//Si oui je crée l'enfant dans un nouveau niveau.
		$refs[ $data->getParentId() ]['children'][ $data->getId() ] = "$thisref;
	}
}

Vous remarquerez que le code utilisé est très court et rapide. Cela empêche l’utilisation de milliers de requêtes!

Et maintenant pour afficher correctement l’arborescence vous aurez besoin de cette fonction.

function generate_tree($arr) {
	//Ouverture du premier ul.
	$html = "<ul>";
	//Boucle récursive qui créera les prochains ul.
	foreach ($arr as $v) {
		//Ajout d'un entré au même niveau.
		$html .= "<li>".$v['name']."</li>";
		//Si un enfant existe, on rappel la même fonction récursivement
		if (array_key_exists('children', $v)) {
			$html .= "".toUL($v['children'])."";
		}
	}
	//On ferme le ul initial!
	$html .= "</ul>";
	//Et on renvoie le contenu
	return $html;
}

C’est ce qui conclut ce léger tutorial qui avait pour but de vous rendre la tâche facile avec ces structures de données qui sont habituellement bien difficile a manipuler.

Commentaire de l'article



[live fast, make love, play music, die happy]

Tout droits réservés © 2011 tbergeron->myHeadInsideOut();|Design par Rubiqube.com

 http://www.wikio.fr