文章目录 [+]
用递归写一个树行结构的分类树吧,由浅入深,一步一步的走,上边是最简单的,大哥哥们可以借鉴的看看,么么哒。
首先数据结构如下:
<?php return array( 0 => array( 'id' => 27, 'name' => '系统', 'sort' => 100, 'pid' => 0, ), 1 => array( 'id' => 28, 'name' => 'linux', 'sort' => 100, 'pid' => 27, ), 2 => array( 'id' => 29, 'name' => 'Centos', 'sort' => 100, 'pid' => 28, ), 3 => array( 'id' => 30, 'name' => 'Ubuntu', 'sort' => 100, 'pid' => 28, ), 4 => array( 'id' => 31, 'name' => 'Kali', 'sort' => 100, 'pid' => 28, ), 5 => array( 'id' => 32, 'name' => 'Ubuntu1604', 'sort' => 100, 'pid' => 30, ), 6 => array( 'id' => 33, 'name' => 'Ubuntu1610', 'sort' => 100, 'pid' => 30, ), 7 => array( 'id' => 34, 'name' => 'Windows', 'sort' => 100, 'pid' => 27, ), 8 => array( 'id' => 35, 'name' => 'Win7', 'sort' => 100, 'pid' => 34, ), 9 => array( 'id' => 36, 'name' => '程序', 'sort' => 100, 'pid' => 0, ), 10 => array( 'id' => 37, 'name' => '前端', 'sort' => 100, 'pid' => 36, ), 11 => array( 'id' => 38, 'name' => 'PHP', 'sort' => 100, 'pid' => 36, ) );
然后下边是最简单的一个递归分类:
<?php /** * 递归分类(最简单版本) * @param $data 所有分类 * @param int $pid pid(父级ID)(可以自己指定pid) */ function gettree($data,$pid = 0){ static $arr = []; // 定义一个静态变量,用来接收结果 foreach ($data as $key => $value){ // 循环变量 if($value['pid'] == $pid){ // 如果$value的pid等于父级id(也就是$pid),说明就是他的子集 $arr[] = $value; // 添加到数组中 gettree($data, $value['id']); // 然后再次循环,要注意子集的id是子集的父id,千万别写成$value['pid'] } } return $arr; // 返回变量 } $tree = gettree($all,0); echo '<pre>'; print_r($tree);
写下边的是加上深度以及名字结构的递归分类
<?php /** * 树形结构(获取pid里的) * @param $all 所有数据 * @param int $pid 父级id * @param int $dep 深度 * @param null $default 为了清空静态变量(有时候foreach这个gettree的时候,会导致里面的$arr不是空的,所以给个判断) * @return array 返回数据 */ function gettree($all, $pid = 0, $dep = 1, $default = null) { static $arr = []; // 定义静态变量 if (is_array($default)) { // 判断如果$default是个空数组,那么就让$arr滞空 $arr = $default; // 滞空$arr } foreach ($all as $key => $value) { // 循环数组 if ($value['pid'] == $pid) { // 说明是pid的子类 $nbsp = addprefix($dep); // 根据深度去给name一个结构 例如:|─分类 $value['_cname'] = $nbsp . $value['name']; // 将这个附加到里面 $value['dep'] = $dep; // 将深度也写进去 $arr[] = $value; // 追加到数组中 gettree($all, $value['id'], $dep + 1); //根据让深度变成+1,递归 } } return $arr; // 返回数组 } /** * 根据数组追加前缀 * @param $dep 深度 * @return string */ function addprefix($dep) { $nbsp = ''; if ($dep == 2) { // 如果深度为2,就给他|-这个样式 $nbsp .= "|─ "; } if ($dep > 2) { // 如果大于2,就按照深度给不同的空格 for ($i = 0; $i < $dep - 1; $i++) { $nbsp .= "| "; } $nbsp .= "└─ "; } return $nbsp; } $tree = gettree($all,0); p($tree);
下边的是重头菜,树行图如下:
<?php /** * 树形结构(获取pid里的) * @param $all 所有数据 * @param int $pid 父级id * @param int $dep 深度 * @param null $default 为了清空静态变量(有时候foreach这个gettree的时候,会导致里面的$arr不是空的,所以给个判断) * @return array 返回数据 */ function gettree($all, $pid = 0, $dep = 1, $default = null) { $arr = []; // 定义静态变量 if (is_array($default)) { // 判断如果$default是个空数组,那么就让$arr滞空 $arr = $default; // 滞空$arr } foreach ($all as $key => $value) { // 循环数组 if ($value['pid'] == $pid) { // 说明是pid的子类 $nbsp = addprefix($dep); // 根据深度去给name一个结构 例如:|─分类 $value['_cname'] = $nbsp . $value['name']; // 将这个附加到里面 $value['dep'] = $dep; // 将深度也写进去 $value["sons"] = gettree($all, $value['id'], $dep + 1); //根据让深度变成+1,递归 $arr[] = $value; // 追加到数组中 } } return $arr; // 返回数组 } /** * 根据数组追加前缀 * @param $dep 深度 * @return string */ function addprefix($dep) { $nbsp = ''; if ($dep == 2) { // 如果深度为2,就给他|-这个样式 $nbsp .= "|─ "; } if ($dep > 2) { // 如果大于2,就按照深度给不同的空格 for ($i = 0; $i < $dep - 1; $i++) { $nbsp .= "| "; } $nbsp .= "└─ "; } return $nbsp; } $tree = gettree($all,0); p($tree);
发表评论