当前位置:首页 > PHP教程 > php应用 > 列表

PHP使用递归按层级查找数据(代码详解)

发布:smiling 来源: PHP粉丝网  添加日期:2022-05-30 08:47:15 浏览: 评论:0 

今天主要介绍一下使用递归来按层级查找数据。

原理挺简单的,主要是通过父级id一级一级的循环查找子级,使用PHP循环代码也很容易实现,不过如果层级越多,PHP重复代码也越多,这时可以使用递归来实现这功能。

1、首先查出要使用的数据组成一个数组(避免递归里查询数据库,之后根据这个数组组成自己需要的数据就可以了)

比如得到如下数据:

  1. $data = [ 
  2.  
  3.     ['id' => '1', 'pid' => '0', 'dsp' => '1'], 
  4.  
  5.     ['id' => '2', 'pid' => '0', 'dsp' => '2'], 
  6.  
  7.     ['id' => '3', 'pid' => '0', 'dsp' => '3'], 
  8.  
  9.     ['id' => '4', 'pid' => '1', 'dsp' => '1-4'], 
  10.  
  11.     ['id' => '5', 'pid' => '4', 'dsp' => '1-4-5'], 
  12.  
  13.     ['id' => '6', 'pid' => '5', 'dsp' => '1-4-5-6'], 
  14.  
  15.     ['id' => '7', 'pid' => '3', 'dsp' => '3-7'], 
  16.  
  17.     ['id' => '8', 'pid' => '2', 'dsp' => '2-8'], 
  18.  
  19.     ['id' => '9', 'pid' => '1', 'dsp' => '1-9'], 
  20.  
  21.     ['id' => '10', 'pid' => '4', 'dsp' => '1-4-10'], 
  22.  
  23. ]; 

2、接下来使用递归重组数据,使数据按层级显示。

  1. /** 
  2.  
  3.  * 根据父级id查找子级数据 
  4.  
  5.  * @param $data     要查询的数据 
  6.  
  7.  * @param int $pid 父级id 
  8.  
  9.  */ 
  10.  
  11. public function recursion($data$pid = 0) 
  12.  
  13.  
  14.     static $child = [];   // 定义存储子级数据数组 
  15.  
  16.     foreach ($data as $key => $value) { 
  17.  
  18.         if ($value['pid'] == $pid) { 
  19.  
  20.             $child[] = $value;   // 满足条件的数据添加进child数组 
  21.  
  22.             unset($data[$key]);  // 使用过后可以销毁 
  23.  
  24.             $this->recursion($data$value['id']);   // 递归调用,查找当前数据的子级 
  25.  
  26.         } 
  27.  
  28.     } 
  29.  
  30.     return $child
  31.  

得到结果:

  1.  
  2.   { 
  3.  
  4.     "id""1"
  5.  
  6.     "pid""0"
  7.  
  8.     "dsp""1" 
  9.  
  10.   }, 
  11.  
  12.   { 
  13.  
  14.     "id""4"
  15.  
  16.     "pid""1"
  17.  
  18.     "dsp""1-4" 
  19.  
  20.   }, 
  21.  
  22.   { 
  23.  
  24.     "id""5"
  25.  
  26.     "pid""4"
  27.  
  28.     "dsp""1-4-5" 
  29.  
  30.   }, 
  31.  
  32.   { 
  33.  
  34.     "id""6"
  35.  
  36.     "pid""5"
  37.  
  38.     "dsp""1-4-5-6" 
  39.  
  40.   }, 
  41.  
  42.   { 
  43.  
  44.     "id""10"
  45.  
  46.     "pid""4"
  47.  
  48.     "dsp""1-4-10" 
  49.  
  50.   }, 
  51.  
  52.   { 
  53.  
  54.     "id""9"
  55.  
  56.     "pid""1"
  57.  
  58.     "dsp""1-9" 
  59.  
  60.   }, 
  61.  
  62.   { 
  63.  
  64.     "id""2"
  65.  
  66.     "pid""0"
  67.  
  68.     "dsp""2" 
  69.  
  70.   }, 
  71.  
  72.   { 
  73.  
  74.     "id""8"
  75.  
  76.     "pid""2"
  77.  
  78.     "dsp""2-8" 
  79.  
  80.   }, 
  81.  
  82.   { 
  83.  
  84.     "id""3"
  85.  
  86.     "pid""0"
  87.  
  88.     "dsp""3" 
  89.  
  90.   }, 
  91.  
  92.   { 
  93.  
  94.     "id""7"
  95.  
  96.     "pid""3"
  97.  
  98.     "dsp""3-7" 
  99.  
  100.   } 
  101.  

3、还可以使用下面的方法,显示更有层次感。

  1. /** 
  2.  
  3.  * 根据父级id查找子级数据 
  4.  
  5.  * @param $data     要查询的数据 
  6.  
  7.  * @param int $pid 父级id 
  8.  
  9.  */ 
  10.  
  11. public function recursion($data$pid = 0) 
  12.  
  13.  
  14.     $child = [];   // 定义存储子级数据数组 
  15.  
  16.     foreach ($data as $key => $value) { 
  17.  
  18.         if ($value['pid'] == $pid) { 
  19.  
  20.             unset($data[$key]);  // 使用过后可以销毁 
  21.  
  22.             $value['child'] = $this->recursion($data$value['id']);   // 递归调用,查找当前数据的子级 
  23.  
  24.             $child[] = $value;   // 把子级数据添加进数组 
  25.  
  26.         } 
  27.  
  28.     } 
  29.  
  30.     return $child
  31.  

得到结果:

  1.  
  2.   { 
  3.  
  4.     "id""1"
  5.  
  6.     "pid""0"
  7.  
  8.     "dsp""1"
  9.  
  10.     "child": [ 
  11.  
  12.       { 
  13.  
  14.         "id""4"
  15.  
  16.         "pid""1"
  17.  
  18.         "dsp""1-4"
  19.  
  20.         "child": [ 
  21.  
  22.           { 
  23.  
  24.             "id""5"
  25.  
  26.             "pid""4"
  27.  
  28.             "dsp""1-4-5"
  29.  
  30.             "child": [ 
  31.  
  32.               { 
  33.  
  34.                 "id""6"
  35.  
  36.                 "pid""5"
  37.  
  38.                 "dsp""1-4-5-6"
  39.  
  40.                 "child": [] 
  41.  
  42.               } 
  43.  
  44.             ] 
  45.  
  46.           }, 
  47.  
  48.           { 
  49.  
  50.             "id""10"
  51.  
  52.             "pid""4"
  53.  
  54.             "dsp""1-4-10"
  55.  
  56.             "child": [] 
  57.  
  58.           } 
  59.  
  60.         ] 
  61.  
  62.       }, 
  63.  
  64.       { 
  65.  
  66.         "id""9"
  67.  
  68.         "pid""1"
  69.  
  70.         "dsp""1-9"
  71.  
  72.         "child": [] 
  73.  
  74.       } 
  75.  
  76.     ] 
  77.  
  78.   }, 
  79.  
  80.   { 
  81.  
  82.     "id""2"
  83.  
  84.     "pid""0"
  85.  
  86.     "dsp""2"
  87.  
  88.     "child": [ 
  89.  
  90.       { 
  91.  
  92.         "id""8"
  93.  
  94.         "pid""2"
  95.  
  96.         "dsp""2-8"
  97.  
  98.         "child": [] 
  99.  
  100.       } 
  101.  
  102.     ] 
  103.  
  104.   }, 
  105.  
  106.   { 
  107.  
  108.     "id""3"
  109.  
  110.     "pid""0"
  111.  
  112.     "dsp""3"
  113.  
  114.     "child": [ 
  115.  
  116.       { 
  117.  
  118.         "id""7"
  119.  
  120.         "pid""3"
  121.  
  122.         "dsp""3-7"
  123.  
  124.         "child": [] 
  125.  
  126.       } 
  127.  
  128.     ] 
  129.  
  130.   } 
  131.  
  132. ]

Tags: PHP递归按层级查找数据

分享到: