PHP 使用编码树,生成easyui中的tree样式

 生成树的时候,数据库中一般设计的都为无级数,即为:父子节点的树,例如:基本的数据表设计为:

nodecode 节点编码

parentnodecode 父节点编码

nodename  节点名称

 

这样的形式,在生成树的时候,根据子找父,再找爷爷的关系,一直找到最顶级,来确定一个从属关系,如果由父级找子级再找孙子级,那么,就可以有无限个孩子级,所以这种情况,适合不限分类的一种写法,但是这种写法带来的结果就是,效率比较低,处理的时间长,所以在开发过程中,就出现了一种编码树的形式:基本的数据表设计为:

nodecode 节点编码

nodename 节点名称

这种编码树,子节点,带着父节点的信息,比如说节点编码为:001 名称为:1级 节点编码为:001001 名称为:1_1级,从此可以看出,我只要看到001001就能知道他的父级是谁,也能知道他的子集是谁,在数据库中只要使用 likt '001001%',即可得到,以nodecoder的长度为varchar(30)为例,则最多产生10个子集,即001001001001001001001001001001这样的关系,如果以3位长度为一个节点的长度,则可产生999个同级分类,如果以4个节点长度,则可产生9999个节点,所以随着每个节点的长度的增长,可以容纳更多的节点和子集,此适合不是无限级分类的使用。

 

使用无级树,在网上有许多生成easyui中tree使用Json的方法,下面这样方法是根据编码生生成json的方式,仅为简单的一个实现:

 1     public function getTree($root,$text="typename",$value="typecode", $fileLength = 3) {
 2         $childNode = array();
 3         foreach ($root as $key=>$node) {
 4             unset($childNode);
 5             foreach ($root as $k => $v) {
 6                 if ($this->startWith($v["typecode"], $node["typecode"]) && $v["typecode"] != $node["typecode"]) {
 7                     $childNode[] = $v;
 8                 }
 9             }
10             $treeNode = array();
11             if (strlen($node["typecode"]) == $fileLength) {
12                 $treeNode['children'] = $this->getTree($childNode,$text,$value, $fileLength + 3);
13                 $treeNode["id"] = $node[$value];
14                 $treeNode["text"] = $node[$text];
15                 $treeNode["value"] = $node[$value];
16                 $treeNode["checked"] = "false";
17               //  $node["attributes"] = $node;
18                 $treeNode["state"] = "open";
19                 $tree[] = $treeNode;
20             }
21         }
22         return $tree;
23     }
24     private function startWith($str, $needle) {
25         return strpos($str, $needle) === 0;
26     }

 

posted @ 2015-03-23 15:15  老码农豆豆  阅读(2155)  评论(0编辑  收藏  举报