PHPTreeService.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. namespace service;
  3. /**
  4. * @name PHPTree
  5. * @author crazymus < QQ:291445576 >
  6. * @des PHP生成树形结构,无限多级分类
  7. * @version 1.2.0
  8. * @Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  9. * @updated 2015-08-26
  10. */
  11. class PHPTreeService{
  12. protected static $config = array(
  13. /* 主键 */
  14. 'primary_key' => 'id',
  15. /* 父键 */
  16. 'parent_key' => 'pid',
  17. /* 展开属性 */
  18. 'expanded_key' => 'expanded',
  19. /* 叶子节点属性 */
  20. 'leaf_key' => 'leaf',
  21. /* 孩子节点属性 */
  22. 'children_key' => 'children',
  23. /* 是否展开子节点 */
  24. 'expanded' => false
  25. );
  26. /* 结果集 */
  27. protected static $result = array();
  28. /* 层次暂存 */
  29. protected static $level = array();
  30. /**
  31. * @name 生成树形结构
  32. * @param array 二维数组
  33. * @return mixed 多维数组
  34. */
  35. public static function makeTree($data,$options=array() ){
  36. $dataset = self::buildData($data,$options);
  37. $r = self::makeTreeCore(0,$dataset,'normal');
  38. return $r;
  39. }
  40. /* 生成线性结构, 便于HTML输出, 参数同上 */
  41. public static function makeTreeForHtml($data,$options=array()){
  42. $dataset = self::buildData($data,$options);
  43. $r = self::makeTreeCore(0,$dataset,'linear');
  44. return $r;
  45. }
  46. /* 格式化数据, 私有方法 */
  47. private static function buildData($data,$options){
  48. $config = array_merge(self::$config,$options);
  49. self::$config = $config;
  50. extract($config);
  51. $r = array();
  52. foreach($data as $item){
  53. $id = $item[$primary_key];
  54. $parent_id = $item[$parent_key];
  55. $r[$parent_id][$id] = $item;
  56. }
  57. return $r;
  58. }
  59. /* 生成树核心, 私有方法 */
  60. private static function makeTreeCore($index,$data,$type='linear')
  61. {
  62. extract(self::$config);
  63. foreach($data[$index] as $id=>$item)
  64. {
  65. if($type=='normal'){
  66. if(isset($data[$id]))
  67. {
  68. $item[$expanded_key]= self::$config['expanded'];
  69. $item[$children_key]= self::makeTreeCore($id,$data,$type);
  70. }
  71. else
  72. {
  73. $item[$leaf_key]= true;
  74. }
  75. $r[] = $item;
  76. }else if($type=='linear'){
  77. $parent_id = $item[$parent_key];
  78. self::$level[$id] = $index==0?0:self::$level[$parent_id]+1;
  79. $item['level'] = self::$level[$id];
  80. self::$result[] = $item;
  81. if(isset($data[$id])){
  82. self::makeTreeCore($id,$data,$type);
  83. }
  84. $r = self::$result;
  85. }
  86. }
  87. return $r;
  88. }
  89. }
  90. ?>