PHP生成结构图形状的分类要怎么写

发布于 2022-09-06 13:23:06 字数 1595 浏览 20 评论 0

图片描述

比如这种结构

但是我最多只能做到下面这个

 ├─a2
 │ ├─a3
 │ │ ├─a4
b1
 ├─b2

下面是我的代码。 求大神指导

$data=array(
    ['cid' => 1, 'pid' => 0,'name'=>'福'],
    ['cid' => 2, 'pid' => 1,'name'=>'a2'],
    ['cid' => 3, 'pid' => 2,'name'=>'a3'],
    ['cid' => 4, 'pid' => 3,'name'=>'a4'],
    ['cid' => 9, 'pid' => 0,'name'=>'b1'],
    ['cid' => 10, 'pid' => 9,'name'=>'b2']
);
class Tree{

 static public function SortTree($data, $pid = 0, $level=0, $icon = array(' ├─', ' └─',' │'))
    {
       $arr=[];
       if(!is_array($data) || empty($data)) return array();
        foreach ($data as $k=>$v) {
                $v['level']= $level+1;
            if ($v['pid'] == $pid) {
                $str='';
                if($v['level']>2){
                    $str=str_repeat($icon[2], $v['level']-2);
                }
                #start  填充
                if($v['pid']== 0){
                    $v[$k]['html']='';
                }else{
                    $v[$k]['html'] = $str . $icon[0];
                }
                
                $arr[] =$v;
                $arr = array_merge($arr, self::SortTree($data, $v['cid'], $level + 1));

            }
        }

        return $arr;
    }
}
    $tree=new Tree();
    $a=$tree->SortTree($data);

    foreach ($a as $k=>$v){
        echo $v[$k]['html'].$v['name'].'<br>';
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

萌面超妹 2022-09-13 13:23:06
<?php


    class Tree{

     static public function SortTree($data, $pid = 0, $level=0, $icon = array(' ├─', ' └─',' │'))
        {
           $str="";$arr=[]; 
           if(empty($data)) return array();
            foreach ($data as $k=>$v) {
                if ($v['pid'] == $pid) {
                    $v['level']= $level+1;
                    if($v['level']>2){
                        $str=str_repeat($icon[2], $v['level']-2);
                    }
                    if($v['pid']== 0){
                        $v['html']='';
                    }else{
                        $v['html']= $str . $icon[0];
                    }
                    
                    $arr[] =$v;
                    $arr = array_merge($arr, self::SortTree($data, $v['cid'], $level + 1));
                    
                }    
            }
            return $arr;
        }
        static public function getTree($data,$icon = array(' ├─', ' └─',' │')){
            if(!is_array($data) || empty($data)) return array();
            $arr = self::SortTree($data, $pid = 0, $level=0, $icon = array(' ├─', ' └─',' │'));
            foreach ($arr as $k => $v) {
                $str = ""; 
                if ($v['level'] > 2) {
                    for ($i = 1; $i < $v['level'] - 1; $i++) {
                        $str .= " │";
                    }
                }
                    if($v['level']!=1){
                    if (isset($arr[$k + 1]) && $arr[$k + 1]['level'] >= $arr[$k]['level']) {
                        $arr[$k]['html'] =$str . $icon[0];
                    } else {
                        $arr[$k]['html'] = $str .  $icon[1];
                    }
                }else{
                    $arr[$k]['html'] = $v['html'];
                }

            }
            return $arr;
        }

       


    }

    $data=array(
        ['cid' => 1, 'pid' => 0,'name'=>'a1'],
        ['cid' => 2, 'pid' => 1,'name'=>'a2'],
        ['cid' => 3, 'pid' => 2,'name'=>'a3'],
        ['cid' => 4, 'pid' => 2,'name'=>'a4'],

        ['cid' => 5, 'pid' => 0,'name'=>'a5'],
        ['cid' => 6, 'pid' => 5,'name'=>'a6'],
        ['cid' => 7, 'pid' => 6,'name'=>'a7'],
        ['cid' => 8, 'pid' => 7,'name'=>'a8'],
        ['cid' => 9, 'pid' => 7,'name'=>'a9'],
        ['cid' => 10, 'pid' => 8,'name'=>'a10'],
        ['cid' => 11, 'pid' => 10,'name'=>'11'],
        ['cid' => 12, 'pid' => 11,'name'=>'12'],
        ['cid' => 13, 'pid' => 12,'name'=>'13'],
        ['cid' => 14, 'pid' => 13,'name'=>'14'],
        ['cid' => 15, 'pid' => 14,'name'=>'15'],
        ['cid' => 16, 'pid' => 15,'name'=>'16'],
        
    );
        $tree=new Tree();
        $a=$tree->getTree($data);
        foreach ($a as $k=>$v){

            echo $v['html'].$v['name'].' ---level:'.$v['level'].'<br>';
            
        }

最后最近勉强解决了,如果哪里有问题,欢迎大神帮我指导修正。
最终结果:
a1 ---level:1
 ├─a2 ---level:2
 │ ├─a3 ---level:3
 │ └─a4 ---level:3
a5 ---level:1
 ├─a6 ---level:2
 │ ├─a7 ---level:3
 │ │ ├─a8 ---level:4
 │ │ │ ├─a10 ---level:5
 │ │ │ │ ├─11 ---level:6
 │ │ │ │ │ ├─12 ---level:7
 │ │ │ │ │ │ ├─13 ---level:8
 │ │ │ │ │ │ │ ├─14 ---level:9
 │ │ │ │ │ │ │ │ ├─15 ---level:10
 │ │ │ │ │ │ │ │ │ └─16 ---level:11
 │ │ └─a9 ---level:4
祝大家 五福临门,新年快乐!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文