begin process at 2012 05 27 14:32:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > CLASSE QUI PERMET DE GENERER UN ARBRE

CLASSE QUI PERMET DE GENERER UN ARBRE


 Information sur la source

Note :
5 / 10 - par 1 personne
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :arbre, arborescence, classe Niveau :Débutant Date de création :24/08/2008 Vu / téléchargé :5 427 / 305

Auteur : gagah1

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note


 Description

Voici une classe qui permet de générer un arbre sous forme d'un tableau multidimensionnel.
L'avantage de cette classe c'est qu'elle ne lit qu'une fois la requete en créant une liste des éléments parents et enfants sous forme d'un tableau. Et à partir de ce tableau, on peut faire tout ce qu'on veut.

Source

  • <?php
  • /*
  • * fichier: tree.class.php
  • * description: classe pour traiter l'arborescence des éléments
  • * auteur: gagah
  • */
  • class Tree
  • {
  • // tableau multidimension qui recoit l'arborescence
  • private $node = array();
  • // nom du premier élément. pour id=0
  • private $root;
  • /**************************************************************
  • * constructeur:
  • *
  • **************************************************************/
  • public function __construct($root='Base')
  • {
  • $this->root = $root;
  • $this->clear();
  • }
  • /****************************************************************
  • * make: création d'un tableau multidimensionnel pour stocker l'arborescence
  • * @param $idparent (int): identifiant parent
  • * @param $id (int): identifiant
  • * @param $name(string): nom de l'élément
  • *
  • ****************************************************************/
  • public function make($idparent, $id, $name)
  • {
  • $this->makeArrayNode($idparent, $id, $name, $this->node);
  • }
  • /**************************************************************
  • * child: retourne un tableau en 2 dimensions (id et name) de tous les
  • * arborescents enfants d'un ID.
  • * @param $id (int): identifiant de l'élément à lister
  • * @param $all (booleen): true si tous les sous-éléments inclus
  • * @param $included (booleen): true si on doit inclure aussi l'identifiant
  • *
  • **************************************************************/
  • public function child($id, $all=false, $included=false)
  • {
  • $temp = array();
  • $this->childNode($this->node, $temp, $id, $all, $included);
  • return $temp;
  • }
  • /**************************************************************
  • * listUL: retourne un tableau en 2 dimensions (id et name) de tous les
  • * arborescents enfants d'un ID.
  • * @param $id (int): identifiant de l'élément à lister
  • * @param $all (booleen): true si tous les sous-éléments inclus
  • * @param $included (booleen): true si on doit inclure aussi l'identifiant
  • *
  • **************************************************************/
  • public function listUL($id, $all=false, $included=false)
  • {
  • $str = $this->listNode($this->node, $id, $all, $included);
  • if(!empty($str))
  • $str = "<ul>\r\n". $str ."</ul>\r\n";
  • return $str;
  • }
  • /**************************************************************
  • * clear: efface tous les éléments dans le noeud
  • *
  • **************************************************************/
  • public function clear()
  • {
  • $this->node = array();
  • $this->node['id'] = 0;
  • $this->node['name'] = $this->root;
  • $this->node['child'] = array();
  • }
  • /**************************************************************
  • * getArray: retourne un tableau miltidimensionnel avec comme clés : id,
  • * name et child
  • *
  • **************************************************************/
  • public function getArray()
  • {
  • return $this->node;
  • }
  • /**************************************************************
  • * makeArrayNode:
  • *
  • **************************************************************/
  • private function makeArrayNode($idparent, $id, $name, &$tab)
  • {
  • if(!isset($tab['id']) || !isset($tab['child']))
  • return false;
  • if($tab['id'] == $idparent)
  • {
  • $temp = array();
  • $temp['id'] = $id;
  • $temp['name'] = $name;
  • $temp['child'] = array();
  • array_push($tab['child'], $temp);
  • return true;
  • }
  • else
  • {
  • $count = count($tab['child']);
  • for($i=0; $i<$count; $i++)
  • {
  • if($this->makeArrayNode($idparent, $id, $name, $tab['child'][$i]))
  • return true;
  • }
  • return false;
  • }
  • }
  • /**************************************************************
  • * listNode: retourne une chaine de la liste
  • *
  • **************************************************************/
  • private function listNode($tab, $id, $all=false, $included=false, $find=false)
  • {
  • if($find && $all)
  • $str = '<li>'. $tab['name'] .'</li>';
  • else if(!$find && ($tab['id'] == $id))
  • {
  • if($included)
  • $str = '<li>'. $tab['name'] .'</li>';
  • else
  • $str = '';
  • $find = true;
  • }
  • else
  • $str = '';
  • if(!$find || ($find && $all))
  • {
  • if($find)
  • $str .= '<ul>';
  • foreach($tab['child'] as $value)
  • $str .= $this->listNode($value, $id, $all, $included, $find);
  • if($find)
  • $str .= '</ul>';
  • }
  • else
  • {
  • $str .= '<ul>';
  • foreach($tab['child'] as $value)
  • $str .= '<li>'. $value['name'] .'</li>';
  • $str .= '</ul>';
  • }
  • return $str;
  • }
  • /**************************************************************
  • * childNode: retourne un tableau pour la liste des nodes enfants
  • *
  • **************************************************************/
  • private function childNode($tab, &$ret, $id, $all=false, $included=false, $find=false)
  • {
  • if($find && $all)
  • $ret[] = array('id'=>$tab['id'], 'name'=>$tab['name']);
  • else if(!$find && ($tab['id'] == $id))
  • {
  • if($included)
  • $ret[] = array('id'=>$tab['id'], 'name'=>$tab['name']);
  • $find = true;
  • }
  • if(!$find || ($find && $all))
  • {
  • foreach($tab['child'] as $value)
  • $this->childNode($value, $ret, $id, $all, $included, $find);
  • }
  • else
  • {
  • foreach($tab['child'] as $value)
  • $ret[] = array('id'=>$value['id'], 'name'=>$value['name']);
  • }
  • }
  • }
<?php
/*
*	fichier: tree.class.php
*	description: classe pour traiter l'arborescence des éléments
*	auteur: gagah
*/


class Tree
{
	// tableau multidimension qui recoit l'arborescence
	private $node = array();
	// nom du premier élément. pour id=0
	private $root;
	
	/**************************************************************
	* constructeur:
	*
	**************************************************************/
	public function __construct($root='Base')
	{
		$this->root = $root;
		$this->clear();
	}
	
	/****************************************************************
	* make: création d'un tableau multidimensionnel pour stocker l'arborescence
	*	@param $idparent (int): identifiant parent
	*	@param $id (int): identifiant
	*	@param $name(string): nom de l'élément
	*
	****************************************************************/
	public function make($idparent, $id, $name)
	{		
		$this->makeArrayNode($idparent, $id, $name, $this->node);
	}
	
	/**************************************************************
	* child: retourne un tableau en 2 dimensions (id et name) de tous les
	* arborescents enfants d'un ID.
	*	@param $id (int): identifiant de l'élément à lister
	*	@param $all (booleen): true si tous les sous-éléments inclus
	*	@param $included (booleen): true si on doit inclure aussi l'identifiant
	*
	**************************************************************/
	public function child($id, $all=false, $included=false)
	{
		$temp = array();
		$this->childNode($this->node, $temp, $id, $all, $included);
		return $temp;
	}
	
	/**************************************************************
	* listUL: retourne un tableau en 2 dimensions (id et name) de tous les
	* arborescents enfants d'un ID.
	*	@param $id (int): identifiant de l'élément à lister
	*	@param $all (booleen): true si tous les sous-éléments inclus
	*	@param $included (booleen): true si on doit inclure aussi l'identifiant
	*
	**************************************************************/
	public function listUL($id, $all=false, $included=false)
	{
		$str = $this->listNode($this->node, $id, $all, $included);
		if(!empty($str))
			$str = "<ul>\r\n". $str ."</ul>\r\n";
		return $str;
	}
	
	/**************************************************************
	* clear: efface tous les éléments dans le noeud
	*
	**************************************************************/
	public function clear()
	{
		$this->node = array();
		$this->node['id'] = 0;
		$this->node['name'] = $this->root;
		$this->node['child'] = array();
	}
	
	/**************************************************************
	* getArray: retourne un tableau miltidimensionnel avec comme clés : id,
	*		name et child
	*
	**************************************************************/
	public function getArray()
	{
		return $this->node;
	}
	
	/**************************************************************
	* makeArrayNode:
	*
	**************************************************************/
	private function makeArrayNode($idparent, $id, $name, &$tab)
	{
		if(!isset($tab['id']) || !isset($tab['child']))
			return false;
		
		if($tab['id'] == $idparent)
		{
			$temp = array();
			$temp['id'] = $id;
			$temp['name'] = $name;
			$temp['child'] = array();
			array_push($tab['child'], $temp);
			return true;
		}
		else
		{
			$count = count($tab['child']);
			for($i=0; $i<$count; $i++)
			{
				if($this->makeArrayNode($idparent, $id, $name, $tab['child'][$i]))
					return true;
			}
			return false;
		}
	}
	
	/**************************************************************
	* listNode: retourne une chaine de la liste
	*
	**************************************************************/
	private function listNode($tab, $id, $all=false, $included=false, $find=false)
	{
		if($find && $all)
			$str = '<li>'. $tab['name'] .'</li>';
		else if(!$find && ($tab['id'] == $id))
		{
			if($included)
				$str = '<li>'. $tab['name'] .'</li>';
			else
				$str = '';
			$find = true;
		}
		else
			$str = '';
				
		if(!$find || ($find && $all))
		{
			if($find)
				$str .= '<ul>';
			foreach($tab['child'] as $value)
				$str .= $this->listNode($value, $id, $all, $included, $find);
			if($find)
				$str .= '</ul>';
		}
		else
		{
			$str .= '<ul>';
			foreach($tab['child'] as $value)
				$str .= '<li>'. $value['name'] .'</li>';
			$str .= '</ul>';
		}
		
		return $str;
	}
	
	/**************************************************************
	* childNode: retourne un tableau pour la liste des nodes enfants
	*
	**************************************************************/
	private function childNode($tab, &$ret, $id, $all=false, $included=false, $find=false)
	{
		if($find && $all)
			$ret[] = array('id'=>$tab['id'], 'name'=>$tab['name']);
		else if(!$find && ($tab['id'] == $id))
		{
			if($included)
				$ret[] = array('id'=>$tab['id'], 'name'=>$tab['name']);
			$find = true;
		}		
			
		if(!$find || ($find && $all))
		{
			foreach($tab['child'] as $value)
				$this->childNode($value, $ret, $id, $all, $included, $find);
		}
		else
		{
			foreach($tab['child'] as $value)
				$ret[] = array('id'=>$value['id'], 'name'=>$value['name']);
		}
	}
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip MOTEUR DE TEMPLATE PHPBB3 SIMPLIFIÉ EN PHP5

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip TESTS UNITAIRES par pierreSabatier
Source avec une capture CLASSE CONSTRUCTEUR DE TABLEAU HTML EN PHP (REVU ET CORRIGÉ) par demonstorm
CLASSE MYSQL UTILISANT LES FONCTIONS PDO par Vince66
Source avec une capture CRÉATION D'UN TABLEAU AVEC CONTENU DYNAMIQUE par tesniced
UNE ARBORESCENCE. par coucou747

Commentaires et avis

Commentaire de coucou747 le 25/08/2008 06:35:43 administrateur CS

pourquoi ne pas faire une structure recursive ? c'est bien plus souple qu'un array...

Commentaire de gagah1 le 25/08/2008 09:14:34

Comme je suis debutant en PHP. C'est quoi une structure recursive?

Commentaire de Palleas_44 le 25/08/2008 10:58:22

http://fr.wikipedia.org/wiki/R%C3%A9cursivit%C3%A9 =)

Commentaire de coucou747 le 25/08/2008 16:43:14 administrateur CS

palleas_44, t'es hors sujet...

je parlais d'une structure qui contient un "pointeur" vers un autre element de cette structure

un peu comme une liste chainee.

pour un tableau, en general, on fait :
private $node = array();
mais $node contient un tableau d'objets Tree.

Commentaire de Palleas_44 le 25/08/2008 16:49:05

Ah ouais, moi j'ai compris qu'il ne savait pas ce qu'était la récursivité, autant pour moi.

Commentaire de coucou747 le 25/08/2008 16:57:52 administrateur CS

sa fonction listNode est recursive...

Commentaire de gagah1 le 25/08/2008 19:35:27

La recursivité: je connais très bien. Mais d'après ce que je sache, on peut pas créer une structure avec PHP à part les classes. Je pourrais modifier la source en utilisant des listes chainées avec des classes mais je trouve cela plus lourd que d'utiliser un Array.

Commentaire de coucou747 le 25/08/2008 19:49:31 administrateur CS

hum...

comme je l'ai dit dans mon message, tu peux faire en sorte que $node contienne un tableau d'objets Tree.
C'est ce qu'on fait generalement pour ce genre de choses, c'est beaucoup plus souple et beaucoup plus simple a manipuler.

Commentaire de gagah1 le 25/08/2008 20:47:59

Je commence à comprendre ce que tu voulais me dire.

Commentaire de neigedhiver le 26/08/2008 10:17:09

Salut,

Puisque ta source est manifestement du PHP5, pourquoi ne pas utiliser des itérateurs ?

Commentaire de gagah1 le 26/08/2008 10:49:29

Je le savais, je me dis si je poste cette source on me demandera d'utiliser des itérateurs, des interfaces...
Je sais pas si avec un tableau le code est plus leger ou avec des itérateurs?

Commentaire de neigedhiver le 26/08/2008 12:19:04

Désolé... ^^ Mais j'adooooore les itérateurs...

Euh donc, logiquement, avec des itérateurs, ton code sera infiniment plus lisible, infiniment plus facile à maintenir, etc. Par contre, utiliser des itérateurs risque de faire passer le niveau de débutant à initié, et le code, s'il est plus lisible, ne sera pas forcément plus facile d'accès pour un débutant (précision : pour un débutant qui ne veut pas chercher à comprendre).
La classe RecursiveArrayIterator de la SPL est toute désignée pour manipuler des tableaux "récursifs".
http://www.php.net/~helly/php/ext/spl/

Commentaire de nico1610 le 15/09/2008 08:41:28 5/10

Source amusante,
il est vrai qu'on apprend rapidement à utiliser une structure récursive pour gérer les arbres, simplement chainé ou doublement chainé.

Rapidement une classe node va avoir un (simplement) ou deux (doublement) pointeur sur d'autre classe node. Pour les simples, c'est généralement le suivant, pour les doubles on ajoute le précédent, ensuite on peu circuler dans la node sans problème. Il ne reste plus qu'a mettre les methodes del(), add(), move() ... et tout ce qui te paraitera utile.

Dans un chaine, il n'y a que deux elements maximum autour d'une node (le précedent et le suivant), le problème de l'arbre est qu'une node a comme dénominateur un parent qui peut être le méme que pour d'autre node. La solution reviens alors à soit faire un arbre simple (on indique que le parent) soit un arbre complexe, chaque node aura en reférence son parent mais aussi le nombre d'enfant qu'elle possède et au besoin un indexage.
Pour finir il faut, là aussi, ajouter les méthodes, un peu plus complexe:
-add_child() / ajouter un enfant
-add_same() / ajouter une node au même niveau
-del() / ne pas oublier que supprimer un parent doit aussi tuer tout ces enfants ! (je sais c'est mal mais c'est du code)
-move_up() / permet de remonter l'enfant au niveau de son parent
et toutes les méthodes qui peuvent être utile ...

Désolé pour mon français, j'ai beau me relire ça persiste!

Ergo.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Afficher l'arborescence d'un autre serveur [ par klandestin ] Bonjour,je suis en stage et pour un intranet je dois écrire un sript php pour afficher l'arboresence du serveur NT (où sont stockés les comptes utilis probleme de classe en php [ par Elkaire ] Donc voila mon probleme!!dans une premiere page je rensegne les insances de mon objet. Une fois renseigné je peux réutiliser les instances cet objet d Parametre de ma classe connexion et connexion/deconnexion [ par sebos63 ] Bonjour, 1. J'ai une classe de connexion et je souhaiterais savoir où il est judicieux de spécifier les paramètres d'une connexion. (Dans mon construc arborescence forum [ par BirD ] Hello, je suis en train de créer un forum, mais je ne sais pas comment réaliser l'arborecence de celui-ci, si quelqu'un à une idée (pas besoin de code template.inc [ par joedalton ] bonjourVoila, je possede un fichier template.inc qui me permet de définir ma classe template, mais le probleme c'est que ce fichier est valable pour l Inversion de matrice [ par VanSama ] Bonjours, pour les besoins d'analyse d'une image, je recherche un algorithme de d'inversion d'une matrice NxN.J'ai lue beaucoup de chose sur le site d Quand on parle de Classe [ par Tomcube ] C'est une question très vaste,On parle de plus en plus de programmation objet. Qui dit programmation objet dit classe. D'ailleurs, c'est fou le nombre problème de classe [ par guixyz ] Hello! Voila je suis en train d'apprendre a me servir des classes en php. Et j'en ai fait une pour gérer mes formulaires Donc j'ai ma classe, une fcti Pb avec classe en php, Affichage [ par matou82 ] Je voudrais savoir comment surcharger l'affichage d' echo ou print pour une classePour avoir:$obj = new Maclass;echo $obj;Cela affiche : "Object" Je s Classe et panier [ par romalafrite ] http://www.phpcs.com/code.aspx?ID=12931Quelqu'un peut me dire comment récupérer le contenu du panier une fois que la sélection a été faite ?visit inte


Nos sponsors


Sondage...

Comparez les prix

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,671 sec (4)

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