parentid = $parentid; $this->label = $label; } }; class TreeMenuItem { public $label; public $subs; public function __construct($label) { $this->label = $label; $subs = array(); } } function load() { $rawmenu = array(); $con = new mysqli('localhost', 'root', '', 'Test'); $stmt = $con->prepare('SELECT id,parentid,label FROM menu'); $stmt->execute(); $stmt->store_result(); $stmt->bind_result($id, $parentid, $label); while($stmt->fetch()) { $rawmenu[$id] = new RawMenuItem($parentid, $label); } $stmt->close(); $con->close(); return $rawmenu; }; function raw2tree_level($value, &$a, $rawmenu) { foreach($rawmenu as $id => $item) { if($item->parentid === $value) { $a[$id] = new TreeMenuItem($item->label); raw2tree_level($id, $a[$id]->subs, $rawmenu); } } } function raw2tree($rawmenu) { $treemenu = array(); raw2tree_level(0, $treemenu, $rawmenu); return $treemenu; } define('INDENT_LEVEL',' '); function display_list($indent, $treemenu) { echo $indent . "\r\n"; } $rawmenu = load(); $treemenu = raw2tree($rawmenu); display_list('', $treemenu); ?>