欢迎光临
我们一直在努力

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

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

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

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

比如得到如下数据:

$data = [     ['id' => '1', 'pid' => '0', 'dsp' => '1'],     ['id' => '2', 'pid' => '0', 'dsp' => '2'],     ['id' => '3', 'pid' => '0', 'dsp' => '3'],     ['id' => '4', 'pid' => '1', 'dsp' => '1-4'],     ['id' => '5', 'pid' => '4', 'dsp' => '1-4-5'],     ['id' => '6', 'pid' => '5', 'dsp' => '1-4-5-6'],     ['id' => '7', 'pid' => '3', 'dsp' => '3-7'],     ['id' => '8', 'pid' => '2', 'dsp' => '2-8'],     ['id' => '9', 'pid' => '1', 'dsp' => '1-9'],     ['id' => '10', 'pid' => '4', 'dsp' => '1-4-10'], ];

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

/**  * 根据父级id查找子级数据  * @param $data     要查询的数据  * @param int $pid 父级id  */ public function recursion($data, $pid = 0) {     static $child = [];   // 定义存储子级数据数组     foreach ($data as $key => $value) {         if ($value['pid'] == $pid) {             $child[] = $value;   // 满足条件的数据添加进child数组             unset($data[$key]);  // 使用过后可以销毁             $this->recursion($data, $value['id']);   // 递归调用,查找当前数据的子级         }     }     return $child; }

得到结果:

[   {     "id": "1",     "pid": "0",     "dsp": "1"   },   {     "id": "4",     "pid": "1",     "dsp": "1-4"   },   {     "id": "5",     "pid": "4",     "dsp": "1-4-5"   },   {     "id": "6",     "pid": "5",     "dsp": "1-4-5-6"   },   {     "id": "10",     "pid": "4",     "dsp": "1-4-10"   },   {     "id": "9",     "pid": "1",     "dsp": "1-9"   },   {     "id": "2",     "pid": "0",     "dsp": "2"   },   {     "id": "8",     "pid": "2",     "dsp": "2-8"   },   {     "id": "3",     "pid": "0",     "dsp": "3"   },   {     "id": "7",     "pid": "3",     "dsp": "3-7"   } ]

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

/**  * 根据父级id查找子级数据  * @param $data     要查询的数据  * @param int $pid 父级id  */ public function recursion($data, $pid = 0) {     $child = [];   // 定义存储子级数据数组     foreach ($data as $key => $value) {         if ($value['pid'] == $pid) {             unset($data[$key]);  // 使用过后可以销毁             $value['child'] = $this->recursion($data, $value['id']);   // 递归调用,查找当前数据的子级             $child[] = $value;   // 把子级数据添加进数组         }     }     return $child; }

得到结果:

[   {     "id": "1",     "pid": "0",     "dsp": "1",     "child": [       {         "id": "4",         "pid": "1",         "dsp": "1-4",         "child": [           {             "id": "5",             "pid": "4",             "dsp": "1-4-5",             "child": [               {                 "id": "6",                 "pid": "5",                 "dsp": "1-4-5-6",                 "child": []               }             ]           },           {             "id": "10",             "pid": "4",             "dsp": "1-4-10",             "child": []           }         ]       },       {         "id": "9",         "pid": "1",         "dsp": "1-9",         "child": []       }     ]   },   {     "id": "2",     "pid": "0",     "dsp": "2",     "child": [       {         "id": "8",         "pid": "2",         "dsp": "2-8",         "child": []       }     ]   },   {     "id": "3",     "pid": "0",     "dsp": "3",     "child": [       {         "id": "7",         "pid": "3",         "dsp": "3-7",         "child": []       }     ]   } ]

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。