php无限级分类两种方式实现

74 篇文章 0 订阅

方式一:

namespace App\Http\Controllers;

class InfiniteController extends Controller
{
    //路径方式实现无限级
    public function wuxianji(){
        $rows = [
            [
              'id' => '1',
              'name' => '一类目',
                'pid' => '0',
                'path' => '0'
            ],
            [
                'id' => '2',
                'name' => '二类目',
                'pid' => '0',
                'path' => '0'
            ],
            [
                'id' => '3',
                'name' => '小一类目',
                'pid' => '1',
                'path' => '0-1'
            ],
            [
                'id' => '4',
                'name' => '小二类目',
                'pid' => '2',
                'path' => '0-2'
            ],
            [
                'id' => '5',
                'name' => '小小一类目',
                'pid' => '3',
                'path' => '0-1-3'
            ],
        ];
        
        foreach ($rows as &$row){
            $num = substr_count($row['path'], '-');
            if($row['pid'] > 0){
                $pre = '|'.str_repeat('-', $num);
            }else{
                $pre = '';
            }
            $row['tree'] = $pre.$row['name'];
        }
        foreach ($rows as $row2){
            $arr[] = $row2['path'].'-'.$row2['id'];
        }
        
        array_multisort($arr,$rows);
        
        foreach ($rows as $row3){
            echo "<p>{$row3['tree']}</p>";
        }
        //dd($arr);
    }

}

方式二:

递归方式

$rows = [
            [
                'id' => '1',
                'name' => '一类目',
                'pid' => '0',
                'path' => '0'
            ],
            [
                'id' => '2',
                'name' => '二类目',
                'pid' => '0',
                'path' => '0'
            ],
            [
                'id' => '3',
                'name' => '小一类目',
                'pid' => '1',
                'path' => '0-1'
            ],
            [
                'id' => '4',
                'name' => '小二类目',
                'pid' => '2',
                'path' => '0-2'
            ],
            [
                'id' => '5',
                'name' => '小小一类目',
                'pid' => '3',
                'path' => '0-1-3'
            ],
    ];
        
        $trees = buildTree(0);
        $str = showLeimu($trees);
        echo $str;
    
    function findChild(&$arr,$id){
        $childs = [];
        foreach ($arr as $k=>$v){
            if($v['pid'] == $id){
                $childs[] = $v;
            }
        }
        return $childs;
    }
    
    function buildTree($root_id){
        global $rows;
        $childs = findChild($rows, $root_id);
        if(empty($childs)){
            return null;
        }
        foreach ($childs as $k=>$v){
            $rescurTree = buildTree($v['id']);
            if(null != $rescurTree){
                $childs[$k]['childs'] = $rescurTree;
            }
        }
        return $childs;
    }
    
    function showLeimu($trees){
        foreach ($trees as $tree){
            if($tree['pid'] > 0){
                $pre = '|'.str_repeat('-', substr_count($tree['path'], '-'));
            }
            $str.= $pre.$tree['name'].'<br>';
            if(isset($tree['childs'])){
                $str.=showLeimu($tree['childs']);
            }
        }
        return $str;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅坞茶坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值