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 / Exemple :
<?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;
/**************************************************************
*
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;
}
/**************************************************************
*
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']);
}
}
}
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.