Heim >Backend-Entwicklung >PHP-Tutorial >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 }