Jeg blev træt af at skulle lave det samme kode igen og igen hver gang jeg skulle bruge en træstruktur så jeg lavede følgende klasse til at klare en stor del af arbejdet.
Et eksempel på brug af denne klasse kan ses på Sitemappet.
<?php
/*
#Copyright Regin Gaarsmand - email: regin(snabela)gaarsmand.dk
#www.reginscorner.dk
*/
/*
$SITES = array();
$SITES[1] = "ET";
$SITES[2] = "TO";
$SITES[3] = "TRE";
$SITES[4] = "FIRE";
$SITES[5] = "FEM";
$SITES[6] = "SEKS";
$SITES[7] = "SYV";
$SITES[8] = "OTTE";
$SITES[9] = "NI";
$SITES[10] = "TI";
$SITES[11] = "ELEVE";
$tree = new treestructure();
$tree->addpart(1,0);
$tree->addpart(2,1);
$tree->addpart(3,1);
$tree->addpart(4,2);
$tree->addpart(5,2);
$tree->addpart(6,5);
$tree->addpart(7,3);
$tree->addpart(8,6);
$tree->addpart(9,1);
$tree->addpart(10,3);
$tree->addpart(11,4);
printtree($tree);
// printtree()
// Simpelt eksempel på udskrivning af en træstruktur
function printtree($tree,$start = 0,$level=0)
{
global $SITES;
for($i=0;$i<$level;$i++)
{
echo " ";
}
echo "-".$SITES[$start]."<br>";
if(count($tree->childrens[$start])>0)
{
$level++;
foreach($tree->childrens[$start] as $value)
{
printtree($tree,$value,$level);
}
}
}
*/
class treestructure
{
var $ids;
var $childrens;
var $returnvalue;
function treestructure()
{
$this->ids = array();
$this->childrens = array();
}
/*
addpart()
Tilføjer en ny sammenslutning til træet.
*/
function addpart($id, $pid,$title=null)
{
$idpart = new treepart($id, $pid,$title, &$this);
$this->ids[$id]= $idpart;
$this->childrens[$pid][] = $id;
}
/*
unfold()
Returnerer en ny træstruktur fra den originale.
$start - id til stedet hvor træstrukturen begynder.
$exclude - exclude er id på en gren som ikke skal medtages i træstrukturen
*/
function unfold($start, $exclude=null,$returnvalue = null)
{
if($returnvalue===null)
{
$returnvalue = new treestructure();
$returnvalue->addpart($start,0,$this->ids[$start]->title,$this->ids[$start]->type);
}
else
{
$returnvalue->addpart($start, $this->ids[$start]->pid, $this->ids[$start]->title,$this->ids[$start]->type);
}
if(count($this->childrens[$start])>0 && $start != $exclude)
{
foreach($this->childrens[$start] as $value)
{
$returnvalue = $this->unfold($value,$exclude,$returnvalue);
}
}
return $returnvalue;
}
/*
climb()
Klatrer ned til roden fra en given id.
Returnerer de id'er som er fra starten og ned til roden eller starten på en gren som er "faldet af træet".
$id - stedet hvor nedklatringen starter.
$array - skal ikke udfyldes udefra.
*/
function climb($id, $array=array())
{
$array = array_merge(array($this->ids[$id]->id),$array);
if($this->ids[$id]->pid!=0)
{
$array = $this->climb($this->ids[$id]->pid,$array);
}
return $array;
}
/*
brokenbranches()
Returnerer de grene som ikke hører sammen med roden.
I en "rigtig" træstruktur skulle denne funktion gerne returnere et tomt array!
*/
function brokenbranches()
{
$bb = array();
foreach($this->ids as $key =>$value)
{
if(!$this->ids[$value->pid]&&$value->pid!=-1||$value->pid==$value->id)
{
$bb[] = $key;
}
}
return $bb;
}
/*
in_tree()
Finder ud af om en bestemt knude er i træet
$id er id på knude der testes efter
*/
function in_tree($id)
{
if($this->ids[$id])
{
return true;
}
return false;
}
/*
dtree() - Til implementering af JavaScript dTree på - http://www.destroydrop.com/javascripts/tree/
*/
function dtree($name,$moving="true",$escape=0)
{
$str = '<script type="text/javascript">
moving = '.$moving.';
escapet = '.$escape.';
'.$name.'= new dTree(\''.$name.'\');
';
foreach($this->ids as $v)
{
$str .= "$name.add($v->id,$v->pid,'".$v->title."','".$v->type."');\n";
}
$str .= "document.write($name);
</script>";
return $str;
}
}
class treepart
{
var $id;
var $pid;
var $title;
var $tree;
function treepart($id, $pid, $title,$tree)
{
$this->id = $id;
$this->SetPid($pid);
$this->title = $title;
$this->tree = &$tree;
}
function SetPid($pid)
{
if($pid===null)
{
$this->pid=$this->id;
}
else
{
if($pid==0)
{
$this->pid = -1;
}
else
{
$this->pid=$pid;
}
}
}
}
?>