php生成二叉树
数据结构和简单效果。

```
<span class="hljs-keyword">class datatree</span>{
private $gui=2; //规
private $ceng=2; //层
private $maxcle; //列
private $default_data=array();//默认数据
private $mark=array();// 关联标记
public $error=null;
private $table_w=800; //表格宽度
protected $data_arr=array();
<span class="hljs-keyword">function __construct($gui,$ceng,$mark)</span>{
if(intval($gui)>0){
$this->gui=intval($gui);
}
if(intval($ceng)>0){
$this->ceng=intval($ceng);
}
if(is_string($mark)){
$mark=explode(',', $mark);
}
if($this->gui!=count($mark)){
$this->error="标记数量不正确,无法获取数据";
}else{
$this->mark=$mark;
}
$this->maxcle=pow($this->gui,$this->ceng-1);
//初始默认值
$this->default_data['username']='未注册';
$this->default_data['status']='---';
$this->default_data['_leftmoney']=0;
$this->default_data['_rightmoney']=0;
$this->default_data['leftmoney']=0;
$this->default_data['rightmoney']=0;
//初始默认值
}
<span class="hljs-keyword">function setDefault($data=array<span class="hljs-params">())</span></span>{
if($this->error) return $this->error;
$this->default_data=$data;
}
<span class="hljs-keyword">function getTreeData($topuser)</span>{ //传入顶层人员数据
if($this->error) return $this->error;
for($ci=1;$ci<=$this->ceng;$ci++){ //层数循环
for($li=1;$li<= pow($this->gui,$ci-1);$li++){//元素循环
if($ci==1){
$this->data_arr[$ci][$li]=$topuser;
}else{
$last_c=$ci-1; //上一层
$last_li= ceil($li/$this->gui); //上一层 第几个人
$now_li= $li>3 ? fmod($li,$this->gui) : $li ; //上一层 第几个人 第几个区
$now_li=$now_li-1;
if( is_array($this->data_arr[$last_c][$last_li]) && $this->data_arr[$last_c][$last_li][$this->mark[$now_li]]){
$where['username']=$this->data_arr[$last_c][$last_li][$this->mark[$now_li]];
$member_data=M("member")->where($where)->find();
}else{
$member_data=false;
}
$this->data_arr[$ci][$li]=$member_data;
}
}
}
}
<span class="hljs-keyword">function buildhtml($topuser=<span class="hljs-string">'')</span></span>{
if($this->error) return $this->error;
if(!$this->data_arr){
$this->getTreeData($topuser);
}
$html ='<style>'</style>;
$html .='.li_tbale{ background:#999; width:150px; }';
$html .='.li_tbale td{ width:50px; background:#FFF; color:#333; text-align:center;}';
$html .='.line_c,.line_l,.line_r{ padding-top:10px; width:'.(1/$this->gui*100).'%; display:inline-block; float:left; }';
$html .='.line_c{ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAAKCAMAAAAQGYTCAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyODFENjM2RTM1MzUxMUU2OUQ4MzlFMkFBMzFEQzMyNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyODFENjM2RjM1MzUxMUU2OUQ4MzlFMkFBMzFEQzMyNiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjI4MUQ2MzZDMzUzNTExRTY5RDgzOUUyQUEzMURDMzI2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjI4MUQ2MzZEMzUzNTExRTY5RDgzOUUyQUEzMURDMzI2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Fe9X/AAAAAZQTFRFm5eX////kclbQAAAAAJ0Uk5T/wDltzBKAAAAPElEQVR42uzTQREAAAgCQexf2gq+ZTcCzCUAwANDG6c3nm4CoSN0hI7QETpCR+gIHaEjdISO0BE6VyvAAA5yHzF3a3MuAAAAAElFTkSuQmCC) no-repeat top center;}';
$html .='.line_l{ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAAKCAMAAAAQGYTCAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpBOTMxOERFQzM1MzYxMUU2QTQxQ0ZFNkU2QzRDRDlCQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpBOTMxOERFRDM1MzYxMUU2QTQxQ0ZFNkU2QzRDRDlCQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkE5MzE4REVBMzUzNjExRTZBNDFDRkU2RTZDNENEOUJDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkE5MzE4REVCMzUzNjExRTZBNDFDRkU2RTZDNENEOUJDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+ycgpngAAAAZQTFRFm5eX////kclbQAAAAAJ0Uk5T/wDltzBKAAAAQklEQVR42uzTQQEAAAgCMexf2gq+ZYuAXoY2oZC/FzpC52PoNug7ugmEjtAROkJH6AgdoSN0hI7QETpCR+hcrQADABhKIxdp19mAAAAAAElFTkSuQmCC) no-repeat top center;}';
$html .='.line_r{ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAAKCAMAAAAQGYTCAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEODUyOTY3RTM1MzYxMUU2ODI2MkM5QkJCNjRCNTc5QiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEODUyOTY3RjM1MzYxMUU2ODI2MkM5QkJCNjRCNTc5QiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ4NTI5NjdDMzUzNjExRTY4MjYyQzlCQkI2NEI1NzlCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ4NTI5NjdEMzUzNjExRTY4MjYyQzlCQkI2NEI1NzlCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Ik4QNgAAAAZQTFRFm5eX////kclbQAAAAAJ0Uk5T/wDltzBKAAAAQklEQVR42uzUAQ0AAAjDMPBvGgUoWCvhYczQs9Q4eqFTCN0EweduA6EjdISO0BE6QkfoCB2hI3SEjtAROkLncwIMAHa0IxdsRGDbAAAAAElFTkSuQmCC) no-repeat top center;}';
$html .='.line_f{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAUCAMAAACQ5xyQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpENThGMkE3MzM1MkQxMUU2QTdFRjk0MERCMjNFNUVGNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpENThGMkE3NDM1MkQxMUU2QTdFRjk0MERCMjNFNUVGNSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ1OEYyQTcxMzUyRDExRTZBN0VGOTQwREIyM0U1RUY1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ1OEYyQTcyMzUyRDExRTZBN0VGOTQwREIyM0U1RUY1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+zJwN2QAAAAZQTFRFm5eXAAAAkXd9UgAAAA5JREFUeNpiYCAfAAQYAAA8AAEshLiqAAAAAElFTkSuQmCC) no-repeat top center; padding-top:10px; width:100%;}';
$html .='';
$html .=<span class="hljs-string">''">';
for($ci=1;$ci<=$this->ceng;$ci++){ //层数循环
$html .='';
for($li=1;$li<= pow($this->gui,$ci-1);$li++){//元素循环
$html .='';
}
$html .='';
}
$html .='<table hljs-string="" width="'</span>.$this->table_w.<tbody><tr><td colspan="'.pow($this->gui,$this->ceng-$ci).<span class=" hljs-string="">'" align="center">';
$html .= $this->format($ci,$li);
$html .= $this->line($ci);
$html .='</td></tr></tbody></table>'</span>;
return $html;
}
protected <span class="hljs-keyword">function line($ci)</span>{
$temp_htlm='';
if($ci!=$this->ceng){
$temp_htlm =<span class="hljs-string">'<div class="line_f">';
for($line_i=1;$line_i<=$this->gui;$line_i++){
if($line_i==1){
$temp_htlm .='<div class="line_l"></div>';
}elseif($line_i==$this->gui){
$temp_htlm .='<div class="line_r"></div>';
}else{
$temp_htlm .='<div class="line_c"></div>';
}
}
$temp_htlm .='</div>'</span>;
}
return $temp_htlm;
}
protected <span class="hljs-keyword">function format($ci,$li)</span>{
$data = $this->data_arr[$ci][$li];
if($data===false){
$data=$this->default_data;
$title_link='未注册';
}else{
$title_link='<a href="#">'</a><a href="#">.$data['username'].'</a>';
}
$temp_htlm = <span class="hljs-string">'';
$temp_htlm .= '';
$temp_htlm .= ' ';
$temp_htlm .= ' ';
$temp_htlm .= '';
$temp_htlm .= ' ';
$temp_htlm .= ' ';
$temp_htlm .= '';
$temp_htlm .= ' ';
$temp_htlm .= ' ';
$temp_htlm .= ' ';
$temp_htlm .= '';
$temp_htlm .= ' ';
$temp_htlm .= ' ';
$temp_htlm .= ' ';
$temp_htlm .= ' ';
$temp_htlm .= ' ';
$temp_htlm .= '<table border="0" cellpadding="0" cellspacing="1" class="li_tbale"><tbody><tr><td colspan="3">'.$title_link.'</td></tr><tr><td colspan="3">'.$data['status'].'</td></tr><tr><td>'.$data['_leftmoney'].'</td><td>'.$data['_rightmoney'].'</td><td>'.$data['_othermoney'].'</td></tr><tr><td>'.$data['leftmoney'].'</td><td>'.$data['rightmoney'].'</td><td>'.$data['othermoney'].'</td></tr></tbody></table>'</span>;
return $temp_htlm;
}
}
```
调用方法:
```
$topuser = M("member")->where("uid=6")->find();
include APP_ROOT_PATH.'Plugin/libs/datatree.php'; //引用类
$datatree = new \datatree(2,3,'_left,_right'); //实例化
echo $datatree->buildhtml($topuser); //传入顶层 生成html
```
评论区