TreeView.php
<?php class TreeView { public $childName = "child"; public $parentid; public $id; public $nameColumn; function __construct($parentid, $id,$nameColumn) { $this->parentid = $parentid; $this->id = $id; $this->nameColumn=$nameColumn; } public function display($Nodes) { echo '<div class="TreeView"><ul>'; $GroupNodes = $this->buildTree($Nodes->list, $this->parentid, $this->id); $this->showTree($GroupNodes); echo '</ul>'; } function buildTree($temp, $parentid, $idKey) { $grouped = $this->reGroup($temp, $parentid, $idKey); $fnBuilder = function ($siblings) use(&$fnBuilder, $grouped, $idKey) { foreach ($siblings as $k => $sibling) { $id = $sibling[$idKey]; if (isset($grouped[$id])) { $sibling[$this->childName] = $fnBuilder($grouped[$id]); } $siblings[$k] = $sibling; } return $siblings; }; $tree = $fnBuilder($grouped[0]); return $tree; } function showTree($grouped) { foreach($grouped as $subGroupKey=>$subGroup){ if(is_array($subGroup)){ if($subGroupKey===$this->childName){ //当前有子集 echo '<ul>'; $this->showTree($subGroup); echo '</ul></li>'; }else{ echo '</li>'; $this->showTree($subGroup); } }else{ if($subGroupKey===$this->nameColumn){ echo '<li><div class="clickOnCollpose"><div class="title"><a>'.$subGroup.'</a></div></div>'; } } } } function reGroup($temp, $parentid, $id) { $group = array(); foreach ($temp as $item) { $key = $item[$parentid]; $group[$key][] = $item; } return $group; } } class Nodes{ public $list; function __construct(){ $this->list=array(); } public function add($Node) { array_push($this->list, $Node); } public function removeByNode($Node) { for ($i = 0;$i < count($this->list);$i++) { if ($this->list[$i] === $Node) { $this->remove($i); } } } public function removeByIndex($startIndex, $length = 0) { array_splice($this->list, $startIndex, $lenght); } public function clear() { unset($this->list); } } ?>
TreeView.css
ul{ list-style:none; padding-left: 1em; } .clickOnCollpose{ display: inline-block; background-color: #eee; width:100%; margin:4px 0px 4px 0px; border-radius: 6px; border-width: 1px; border-color: #aaa; border-style: solid; padding:4px; } .clickOnCollpose:hover{ background-color: #337ABC; color:#FFFFFF; padding:4px; border-color:#FFF; } .title{ float:left; text-indent: 10px; } .count-near{ background-color:#FF0000; border-radius:20px; color:#FFF; font-weight:bold; width:20px; height:20px; text-align:center; float:left; margin-left:20px; } .count-far{ background-color:#FF0000; border-radius:20px; color:#FFF; font-weight:bold; width:20px; height:20px; text-align:center; float:right; } li{ cursor:hand; } .treeview{ width:100%; }
TreeView.js
$(document).ready(function(){ //默认从第2级隐藏 $(".treeView ul li").find("ul").toggle(); $(".clickOnCollpose").on('click',function(){ //展开/收缩下级 $(this).parent().find("ul").toggle(); //展开/收缩下下级 $(this).parent().find("ul li ul").toggle(); }) $(".clickOnCollpose").mouseenter(function(){ var count=$(this).next().children().length; //if(count>0){ //class修改成 count-near 更改样式 $(this).append("<div class='count-far'> "+count+" </div>"); //} }) $(".clickOnCollpose").mouseleave(function(){ //class修改成 count-near 更改样式 $(this).find(".count-far").remove(); }) })
==============================================================
Demo.php
<?php require_once("TreeView.php"); ?> <html> <head> <title>测试</title> <link rel="stylesheet" href="./TreeView.css" type="text/css"/> <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script> <script src="./TreeView.js"></script> </head> <body> <?php $n=new Nodes(); $n->add( ["id" => 1, "name" => "name0-1", "parentid" => 0]); $n->add( ["id" => 2, "name" => "name1-2", "parentid" => 1]); $n->add( ["id" => 3, "name" => "name1-3", "parentid" => 1]); $n->add( ["id" => 4, "name" => "name2-4", "parentid" => 2]); $n->add( ["id" => 5, "name" => "name2-5", "parentid" => 2]); $n->add( ["id" => 6, "name" => "name4-6", "parentid" => 4]); $n->add( ["id" => 7, "name" => "name1-7", "parentid" => 1]); $n->add( ["id" => 8, "name" => "name2-8", "parentid" => 2]); $n->add( ["id" => 9, "name" => "name2-9", "parentid" => 2]); $n->add( ["id" => 10, "name" => "name2-10", "parentid" => 2]); $n->add( ["id" => 11, "name" => "name8-11", "parentid" => 8]); $n->add( ["id" => 12, "name" => "name8-12", "parentid" => 8]); $n->add( ["id" => 13, "name" => "name11-13", "parentid" => 11]); $n->add( ["id" => 14, "name" => "name0-14", "parentid" => 0]); $n->add( ["id" => 15, "name" => "name0-15", "parentid" => 0]); $treeview=new TreeView("parentid","id","name"); //可写作$treeview=new TreeView(2,0,1); $treeview->display($n); ?> </body> </html>