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

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

作者:Lee_吉 2018-06-30 来源:51CTO

I、php: 一、梯式:

  1. 代码:
    /*
    @desc:获取梯式分类
    @param data 需要转换的数据
    @param pkey 上级的键名
    @param key 主键名
    @param pid 顶级id
    @param level 起始层级 默认0
    @return ret 转换后的数组
    */
    function getleveltree($data,$pkey,$key,$pid = 0,$level = 0){
    $ret = array();
    foreach ($data as $v){
        if($v[$pkey] == $pid){
            $v['level'] = $level;
            $ret[] = $v;
            $ret = array_merge($ret,getleveltree($data,$pkey,$key,$v[$key],$level+1));
        }
    }
    return $ret;
    }
  2. 测试:
    $data = array(
        array(
            'id' => 1,
            'pid' => 0
        ),
        array(
            'id' => 2,
            'pid' => 1
        ),
        array(
            'id' => 3,
            'pid' => 2
        )
    );
    $ret = getleveltree($data,'pid','id');
    var_dump($ret);
  3. 输出:
    array(3) {
    [0]=>
    array(3) {
    ["id"]=>
    int(1)
    ["pid"]=>
    int(0)
    ["level"]=>
    int(0)
    }
    [1]=>
    array(3) {
    ["id"]=>
    int(2)
    ["pid"]=>
    int(1)
    ["level"]=>
    int(1)
    }
    [2]=>
    array(3) {
    ["id"]=>
    int(3)
    ["pid"]=>
    int(2)
    ["level"]=>
    int(2)
    }
    }
    二、裂变式:
  4. 代码:
    /*
    @desc:获取裂变式分类
    @param data 需要转换的数据
    @param pkey 上级的键名
    @param key 主键名
    @param pid 顶级id 默认0
    @return ret 转换后的数组
    */
    function getsubtree($data,$pkey,$key,$pid = 0) {
    $ret = array();
    foreach ($data as $v){
        if($v[$pkey] == $pid){
            $v['child'] = getsubtree($data,$pkey,$key,$v[$key]);
            $ret[] = $v;            
        }
    }
    return $ret;
    }
  5. 测试:
    $data = array(
        array(
            'id' => 1,
            'pid' => 0
        ),
        array(
            'id' => 2,
            'pid' => 1
        ),
        array(
            'id' => 3,
            'pid' => 2
        )
    );
    $ret = getsubtree($data,'pid','id');
    var_dump($ret);
  6. 输出:
    array(1) {
    [0]=>
    array(3) {
    ["id"]=>
    int(1)
    ["pid"]=>
    int(0)
    ["child"]=>
    array(1) {
      [0]=>
      array(3) {
        ["id"]=>
        int(2)
        ["pid"]=>
        int(1)
        ["child"]=>
        array(1) {
          [0]=>
          array(3) {
            ["id"]=>
            int(3)
            ["pid"]=>
            int(2)
            ["child"]=>
            array(0) {
            }
          }
        }
      }
    }
    }
    }
    II、javascript: 一、梯式:
  7. 代码:
    /*
    @desc:获取梯式分类
    @param data 需要转换的数据
    @param pkey 上级的键名
    @param key 主键名
    @param pid 顶级id
    @param level 起始层级 默认0
    @return ret 转换后的数组
    */
    function getleveltree(data,pkey,key,pid = 0,level = 0){
    var ret = new Array()
    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],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 },
    { id: 2, pid: 1, level: 1 },
    { id: 3, pid: 2, level: 2 } ]
    二、裂变式:
  10. 代码:
    /*
    @desc:获取裂变式分类
    @param data 需要转换的数据
    @param pkey 上级的键名
    @param key 主键名
    @param pid 顶级id 默认0
    @return ret 转换后的数组
    */
    function getsubtree(data,pkey,key,pid = 0) {
    var ret = new Array()
    for (var i in data){
        if(data[i][pkey] == pid){
            data[i]['child'] = getsubtree(data,pkey,key,data[i][key])
            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: [ [Object] ] } ]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章