<?
function tree($data=false,$key=false)
{
static $pass,$hash;
if ($data)
{
$hash=array();
_tree_hash($data,$key,$hash);
$pass=11;
reset($hash);
}
$item= current($hash);
if ($pass==11)
{
$pass=12;
}
elseif ($pass==12)
{
if ($item===false) return $hash=false;
if ($item[0]!='open') ob_start();
$pass=21;
return true;
}
elseif ($pass==21)
{
if ($item[0]!='open') ob_end_clean();
$pass=221;
}
elseif ($pass==221)
{
if ($item[0]=='branch')
{
$pass=23;
return true;
}
else
{
if ($item[0]!='close') ob_start();
$pass=13;
return false;
}
}
elseif ($pass==23)
{
$pass=222;
}
elseif ($pass==13)
{
if ($item[0]!='close') ob_end_clean();
$item= next($hash);
$pass=12;
}
elseif ($pass==222)
{
if ($item[0]!='close') ob_start();
$pass=13;
return false;
}
return $item[1];
}
function _tree_hash($data,$key,&$hash)
{
$hash[]=array('open',NULL);
foreach ($data as $branch)
{
$hash[]=array('branch',$branch);
if (isset($branch[$key]) && count($branch[$key])>0) _tree_hash($branch[$key],$key,$hash);
}
$hash[]=array('close',NULL);
}
$treedata=array(
array('id'=>'1'),
array('id'=>'2'),
array('id'=>'3','children'=>array(
array('id'=>'3.1'),
array('id'=>'3.2','children'=>array(
array('id'=>'3.3.1'),
array('id'=>'3.3.2'),
)),
array('id'=>'3.4'),
)),
array('id'=>'4'),
);
?>
<div>---------- Here the tree begins ----------</div>
<? for(tree($treedata,'children');tree();tree()): ?>
<ul>
<? for($branch=tree();tree();tree()): ?>
<li><?=$branch['id']?></li>
<? endfor ?>
</ul>
<? endfor ?>
<div>---------- Here it ends ----------</div>