1. <?php
  2. // 原文:https://blog.csdn.net/tiansidehao/article/details/79025359
  3. // 原文:https://blog.csdn.net/qishouzhang/article/details/47204359
  4.  
  5. $array = array(
  6. array('id' => 2, 'pid' => 0, 'name' => 'b'),
  7. array('id' => 3, 'pid' => 1, 'name' => 'a-1'),
  8. array('id' => 1, 'pid' => 0, 'name' => 'a'),
  9. array('id' => 4, 'pid' => 2, 'name' => 'b-1'),
  10. array('id' => 5, 'pid' => 2, 'name' => 'b2'),
  11. array('id' => 6, 'pid' => 5, 'name' => 'b-2-1'),
  12. array('id' => 7, 'pid' => 5, 'name' => 'b-2-2'),
  13. array('id' => 8, 'pid' => 3, 'name' => 'a-1-1'),
  14. array('id' => 9, 'pid' => 1, 'name' => 'a-2'),
  15. );
  16.  
  17. /**
  18. * 递归实现无限极分类(二维数组)
  19. * @param $array 数据
  20. * @param $pid 父ID
  21. * @param $level 分类级别
  22. * @return $list 分好类的数组 直接遍历即可 $level可以用来遍历缩进
  23. */
  24.  
  25. function getTree0($array, $pid = 0, $level = 1){
  26.  
  27. //声明静态数组,避免递归调用时,多次声明导致数组覆盖
  28. static $list = [];
  29. foreach ($array as $key => $value){
  30. //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
  31. if ($value['pid'] == $pid){
  32. //父节点为根节点的节点,级别为1,也就是第一级
  33. $value['level'] = $level;
  34. //把数组放到list中
  35. $list[] = $value;
  36. //把这个节点从数组中移除,减少后续递归消耗
  37. unset($array[$key]);
  38. //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
  39. getTree($array, $value['id'], $level+1);
  40.  
  41. }
  42. }
  43. return $list;
  44. }
  45.  
  46. /**
  47. * 递归实现无限极分类 (多维数组)
  48. * @param $array 数据
  49. * @param $pid 父ID
  50. * @return $tree
  51. */
  52.  
  53. function getTree1($array,$pid = 0){
  54. // 存放排序数组
  55. $tree = array();
  56. foreach($array as $k => $v){
  57. if($v['pid'] == $pid){
  58. //递归获取子记录
  59. $v['child'] = getTree($array,$v['id']);
  60. if($v['child'] == null){ // 没有子类
  61. // 删除 空子类
  62. unset($v['child']);
  63. }
  64. // 删除已处理节点,增加性能
  65. unset($array[$k]);
  66. $tree[] = $v;
  67. }
  68. }
  69. return $tree;
  70. }
  71.  
  72. /**
  73. * 引用实现无限极分类 (多维数组)
  74. * @param $array 数据
  75. * @return $tree
  76. */
  77.  
  78. function getTree2($array)
  79. {
  80. // 格式化数组,让数组索引 = 对应值的 ID
  81. $items = array();
  82. foreach ($array as $key => $val) {
  83. $items [$val['id']] = $val;
  84. }
  85. // 接收处理后的数据
  86. $tree = array();
  87. foreach ($items as $k => $v) {
  88. // 当前元素是否有父亲
  89. if(isset($items [$v['pid']])){
  90. // 有就把他放到父亲下面 且此元素还能被修改(引用传值)
  91. // $arr[$item['pid']]['child'][] = &$arr[$item['id']];
  92. $items[$v['pid']]['child'][] = &$items[$k];
  93. }else{
  94. // 没有就放入数组 且还能被修改(引用传值)
  95. // $tree[] = &$arr[$item['id']];
  96. $tree[] = &$items[$k];
  97. }
  98. }
  99. return $tree;
  100. }
  101.  
  102. echo "<pre>";
  103. print_r(getTree2($array));
  104.  
  105. function infinite($list = [],$parent_id = 0,$deep = 0){
  106. static $arr = [];
  107. foreach ($list as $v){
  108. if($v['p_id'] == $parent_id){
  109. $v['deep'] = $deep;
  110. $arr[] = $v;
  111. infinite($list,$v['id'],$deep + 1);
  112. }
  113. }
  114. return $arr;
  115. }
  116.  
相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!