javascript、php实现无限级分类的两种方式
admin
2023-06-13 10:23:01
0

I、php:

一、梯式:

  1. 代码:
    /*
    @desc:获取梯式分类
    @param data 需要转换的数据
    @param pkey 上级的键名
    @param key 主键名
    @param pid 顶级id
    @param depth 深度 默认1
    @param level 起始层级 默认0
    @return ret 转换后的数组
    */
    function getleveltree($data,$pkey,$key,$pid = 0,$depth = 1,$level = 0){
    $ret = array();
    if($level < $depth){
        foreach ($data as $v){
            if($v[$pkey] == $pid){
                $v['level'] = $level;
                $ret[] = $v;
                $ret = array_merge($ret,getleveltree($data,$pkey,$key,$v[$key],$depth,$level+1));
            }
        }
    }
    return $ret;
    }
  2. 测试:
    $data = array(
        array(
            'id' => 1,
            'pid' => 0
        ),
        array(
            'id' => 2,
            'pid' => 1
        ),
        array(
            'id' => 5,
            'pid' => 1
        ),
        array(
            'id' => 3,
            'pid' => 2
        ),
        array(
            'id' => 4,
            'pid' => 3
        ),
    );
  3. 输出:
    array(1) {
    [0]=>
    array(3) {
    ["id"]=>
    int(1)
    ["pid"]=>
    int(0)
    ["level"]=>
    int(0)
    }
    }

    二、裂变式:

  4. 代码:
    /*
    @desc:获取裂变式分类
    @param data 需要转换的数据
    @param pkey 上级的键名
    @param key 主键名
    @param pid 顶级id 默认0
    @param depth 深度 默认1
    @return ret 转换后的数组
    */
    function getsubtree($data,$pkey,$key,$pid = 0,$depth = 1) {
    $ret = array();
    if($depth > 0){
    $depth --;
        foreach ($data as $v){
            if($v[$pkey] == $pid){
                $v['child'] = getsubtree($data,$pkey,$key,$v[$key],$depth);
                $ret[] = $v;            
            }
        }
    }
    return $ret;
    }
  5. 测试:
    $data = array(
        array(
            'id' => 1,
            'pid' => 0
        ),
        array(
            'id' => 2,
            'pid' => 1
        ),
        array(
            'id' => 5,
            'pid' => 1
        ),
        array(
            'id' => 3,
            'pid' => 2
        ),
        array(
            'id' => 4,
            'pid' => 3
        ),
    );
    $ret = getsubtree($data,'pid','id');
    var_dump($ret);
  6. 输出:
    array(1) {
    [0]=>
    array(3) {
    ["id"]=>
    int(1)
    ["pid"]=>
    int(0)
    ["child"]=>
    array(0) {
    }
    }
    }

    II、javascript:

    一、梯式:

  7. 代码:
    /*
    @desc:获取梯式分类
    @param data 需要转换的数据
    @param pkey 上级的键名
    @param key 主键名
    @param pid 顶级id
    @param depth 深度 默认1
    @param level 起始层级 默认0
    @return ret 转换后的数组
    */
    function getleveltree(data,pkey,key,pid = 0,depth = 1,level = 0){
    var ret = new Array()
    if(level < depth){
        for (var i in data){
            if(data[i][pkey] == pid){
                data[i]['level'] = level
                ret.push(data[i])
                ret = ret.concat(getleveltree(data,pkey,key,data[i][key],depth,level + 1))
            }
        }
    }
    return ret
    }
  8. 测试:
    var data = new Array(
        {
            'id':1,
            'pid':0
        },
        {
            'id':2,
            'pid':1
        },
        {
            'id':3,
            'pid':2
        }
    )
    var ret = getleveltree(data,'pid','id')
    console.log(ret)
  9. 输出:
    [ { id: 1, pid: 0, level: 0 } ]

    二、裂变式:

  10. 代码:
    /*
    @desc:获取裂变式分类
    @param data 需要转换的数据
    @param pkey 上级的键名
    @param key 主键名
    @param pid 顶级id 默认0
    @param depth 深度 默认1
    @return ret 转换后的数组
    */
    function getsubtree(data,pkey,key,pid = 0,depth = 1) {
    var ret = new Array()
    if(depth > 0){
        depth --
        for (var i in data){
            if(data[i][pkey] == pid){
                data[i]['child'] = getsubtree(data,pkey,key,data[i][key],depth)
                ret.push(data[i])
            }
        }
    }
    return ret
    }
  11. 测试:
    var data = new Array(
        {
            'id':1,
            'pid':0
        },
        {
            'id':2,
            'pid':1
        },
        {
            'id':3,
            'pid':2
        }
    )
    var ret = getsubtree(data,'pid','id')
    console.log(ret)
  12. 输出:
    [ { id: 1, pid: 0, child: [] } ]

相关内容

热门资讯

推拉门滑轮坏了怎么修 推拉门滑轮坏了怎么修?首先我们要先把推拉门给拆卸下来。因为它的滑轮坏了,一定要把它拆卸下来再更换新的...
苹果iPhone 17 Pro... IT之家 5 月 26 日消息,科技媒体 Appleinsider 昨日(5 月 25 日)发布博文...
就医缴费的“场景密码”:四种支... 一边带娃一边排队缴费、忘带医保卡干着急、左手医保码右手付款码、住院先凑押金出院再排队…… 这些就医“...
AI让科学家“淡出”科研,“科... 来源:滚动播报 (来源:上观新闻) 上海科技节上,AI与科研成为一个热点话题。 AI能看到人无法感...
“AI+健康”正在构筑怎样的新... 复旦大学公共卫生学院党委书记罗力致辞 在近日召开的第79届世界卫生大会期间,一场高规格的世界卫生组织...
伊朗最高领袖就医情况曝光 新华社德黑兰5月25日电 伊朗媒体25日援引伊朗卫生部公共关系主管克尔曼普尔的话报道,伊朗最高领袖穆...
宇树科技预告上半年业绩 【大河财立方消息】 5月25日,据宇树科技招股书,公司2026年1~3月实现营业收入4.23亿元,同...
重庆高新开发集团原党委书记、董... 经重庆市委批准,重庆市纪委监委对重庆高新开发集团原党委书记、董事长杜国平严重违纪违法问题进行了立案审...
投资额327亿元,河南6个高速... 【大河财立方消息】 近日,京港澳高速郑州段等6个高速改扩建项目工程可行性研究报告编制及前期要件办理服...
国务院任免国家工作人员!免去张... 【大河财立方消息】5月25日,国务院任免国家工作人员。任命高松为北京大学校长。免去张云明的工业和信息...