Tree.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace app\common\components;
  3. /**
  4. * 通用的树型类,可以生成任何树型结构
  5. */
  6. class Tree {
  7. /**
  8. * 生成树型结构所需要的2维数组
  9. * @var array
  10. */
  11. public $arr = array();
  12. /**
  13. * 生成树型结构所需修饰符号,可以换成图片
  14. * @var array
  15. */
  16. public $icon = array('│','├','└');
  17. public $nbsp = "&nbsp;";
  18. /**
  19. * @access private
  20. */
  21. public $ret = '';
  22. /**
  23. * 构造函数,初始化类
  24. * @param array 2维数组,例如:
  25. * array(
  26. * 1 => array('id'=>'1','parent_id'=>0,'name'=>'一级栏目一'),
  27. * 2 => array('id'=>'2','parent_id'=>0,'name'=>'一级栏目二'),
  28. * 3 => array('id'=>'3','parent_id'=>1,'name'=>'二级栏目一'),
  29. * 4 => array('id'=>'4','parent_id'=>1,'name'=>'二级栏目二'),
  30. * 5 => array('id'=>'5','parent_id'=>2,'name'=>'二级栏目三'),
  31. * 6 => array('id'=>'6','parent_id'=>3,'name'=>'三级栏目一'),
  32. * 7 => array('id'=>'7','parent_id'=>3,'name'=>'三级栏目二')
  33. * )
  34. */
  35. public function init($arr=array()){
  36. $this->arr = $arr;
  37. $this->ret = '';
  38. return is_array($arr);
  39. }
  40. /**
  41. * 得到父级数组
  42. * @param int
  43. * @return array
  44. */
  45. public function get_parent($myid){
  46. $newarr = array();
  47. if(!isset($this->arr[$myid])) return false;
  48. $pid = $this->arr[$myid]['parent_id'];
  49. $pid = $this->arr[$pid]['parent_id'];
  50. if(is_array($this->arr)){
  51. foreach($this->arr as $id => $a){
  52. if($a['parent_id'] == $pid) $newarr[$id] = $a;
  53. }
  54. }
  55. return $newarr;
  56. }
  57. /**
  58. * 得到子级数组
  59. * @param int
  60. * @return array
  61. */
  62. public function get_child($myid){
  63. $a = $newarr = array();
  64. if(is_array($this->arr)){
  65. foreach($this->arr as $id => $a){
  66. if($a['parent_id'] == $myid) $newarr[$id] = $a;
  67. }
  68. }
  69. return $newarr ? $newarr : false;
  70. }
  71. /**
  72. * 得到当前位置数组
  73. * @param int
  74. * @return array
  75. */
  76. public function get_pos($myid,&$newarr){
  77. $a = array();
  78. if(!isset($this->arr[$myid])) return false;
  79. $newarr[] = $this->arr[$myid];
  80. $pid = $this->arr[$myid]['parent_id'];
  81. if(isset($this->arr[$pid])){
  82. $this->get_pos($pid,$newarr);
  83. }
  84. if(is_array($newarr)){
  85. krsort($newarr);
  86. foreach($newarr as $v){
  87. $a[$v['id']] = $v;
  88. }
  89. }
  90. return $a;
  91. }
  92. /**
  93. * 得到树型结构
  94. * @param $tid int ID,表示获得这个ID下的所有子级
  95. * @param $str string 生成树型结构的基本代码,例如:"<option value=\$id \$selected>\$spacer\$name</option>"
  96. * @param $sid int 被选中的ID,比如在做树型下拉框的时候需要用到
  97. * @return string
  98. */
  99. public function get_tree($tid, $str, $sid = 0, $adds = '', $str_group = ''){
  100. $number=1;
  101. $child = $this->get_child($tid);
  102. if(is_array($child)){
  103. $total = count($child);
  104. foreach($child as $id=>$value){
  105. $j=$k='';
  106. if($number==$total){
  107. $j .= $this->icon[2];
  108. }else{
  109. $j .= $this->icon[1];
  110. $k = $adds ? $this->icon[0] : '';
  111. }
  112. $spacer = $adds ? $adds.$j : '';
  113. $selected = $id==$sid ? 'selected' : '';
  114. @extract($value);
  115. $parent_id == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";");
  116. $this->ret .= $nstr;
  117. $nbsp = $this->nbsp;
  118. $this->get_tree($id, $str, $sid, $adds.$k.$nbsp,$str_group);
  119. $number++;
  120. }
  121. }
  122. return $this->ret;
  123. }
  124. /**
  125. * 同上一方法类似,但允许多选
  126. */
  127. public function get_tree_multi($tid, $str, $sid = 0, $adds = ''){
  128. $number=1;
  129. $child = $this->get_child($tid);
  130. if(is_array($child)){
  131. $total = count($child);
  132. foreach($child as $id=>$a){
  133. $j=$k='';
  134. if($number==$total){
  135. $j .= $this->icon[2];
  136. }else{
  137. $j .= $this->icon[1];
  138. $k = $adds ? $this->icon[0] : '';
  139. }
  140. $spacer = $adds ? $adds.$j : '';
  141. $selected = $this->have($sid,$id) ? 'selected' : '';
  142. @extract($a);
  143. eval("\$nstr = \"$str\";");
  144. $this->ret .= $nstr;
  145. $this->get_tree_multi($id, $str, $sid, $adds.$k.'&nbsp;');
  146. $number++;
  147. }
  148. }
  149. return $this->ret;
  150. }
  151. private function have($list,$item){
  152. return(strpos(',,'.$list.',',','.$item.','));
  153. }
  154. }
  155. ?>