【PHP】实现无限极分类

1、树形结构
 1 <?php
 2 /**
 3      * @description
 4      * @param array  $arr 传入的二维数组
 5      * @param string $pk 主键id
 6      * @param string $name 分类名称
 7      * @param string $upid 表示父级id的字段
 8      * @param int    $root 根级别(最高父级一般为0)
 9      * @param int    $index 层级
10      * @return array
11      */
12     function getTree($arr = array(),$pk='id',$name='name',$upid='pid',$root=0,$index=0){
13         $tree = array();
14         foreach ($arr as $k=>$value) {
15             if($value[$upid]==$root){
16                 $value[$name] = str_repeat('|--', $index).$value[$name];
17                 $tree[] = $value;
18                 $tree = array_merge($tree,getTree($arr,$pk,$name,$upid,$value[$pk],$index+1));
19             }
20         }
21         return $tree;
22     }
23 
24 ?>
效果如下:
 
2、添加子目录
 1 <?php
 2 /**
 3      * @description
 4      * @param array  $arr 二维数组
 5      * @param string $pk 主键id
 6      * @param string $upid 表示父级id的字段
 7      * @param string $child 子目录的键
 8      * @return array
 9      */
10     function getTree($arr=array(),$pk='id',$upid='pid',$child='child'){
11         $items = array();
12         foreach($arr as $val){
13             $items[$val[$pk]] = $val;
14         }
15         //$items = array_column($arr,NULL,$pk);可替换11-14行代码【推荐使用】
16         $tree = array();
17         foreach($items as $k=>$val){
18             if(isset($items[$val[$upid]])){
19                 $items[$val[$upid]][$child][]=&$items[$k];
20             }else{
21                 $tree[] = &$items[$k];
22             }
23         }
24         return $tree;
25     }
26 
27 ?>

 

效果如下:

测试数组:

$arr = array(
array('id' => 1, 'name' => '系统设置', 'pid' => 0),
array('id' => 2, 'name' => '菜单设置', 'pid' => 0),
array('id' => 3, 'name' => '添加菜单', 'pid' => 2),
array('id' => 4, 'name' => '编辑菜单', 'pid' => 2),
array('id' => 5, 'name' => '网站设置', 'pid' => 1),
array('id' => 6, 'name' => '支付设置', 'pid' => 0)
);


 最后:生成HTML分类代码

/**
 * @description
 * @param $data 为调用上面方法2(添加子目录)得到的结果
 */
function makeHtml($data,&$str='')
{
    $str .= '<ul>';
    foreach ($data as $key => $val) {
        $cateId = $val['id'];
        if (isset($val['child']) && !empty($val['child'])) {
            $str .= "<li class='hasChild top'><a data-id='{$cateId}'>" . $val['name'] . "</a>";
            makeHtml($val['child'],$str);
            $str .= '</li>';
        } else {
            $className = $val['pid'] == 0 ? 'top' : '';
            $str .= "<li class='{$className}'><a data-id='{$cateId}'>" . $val['name'] . "</a></li>";
        }
    }
    $str .= '</ul>';
    return $str;
}

echo makeHtml($data);

 

 

输出如下:

 

 

 

 

 

 

 

posted @ 2019-10-12 10:34  bug毁灭者  阅读(2933)  评论(2编辑  收藏  举报