php无限级(tp5)

 一级分类pid默认为0

依次绑定pid

效果:

效果图

1.控制器中调用模型中的getOption方法

   control:$this->assign('cate_option',cate::getOption($rows['pid']));
   model:
    /**
     * @param int $id 选中的ID
     * @return string
     */
    public static function getOption($id = 0)
    {   
        $rows   = self::where("status=1")->order("sort asc")->select();
        
        $top = ['id'=>0,'name'=>'顶级分类','pid'=>''];
        $mer = merge(array_to_object($top),$rows);
        
        return make_option_tree_for_select($mer);
       
    }   
    

2.将顶级分类转化成对象

if(!function_exists('array_to_object')){
    function array_to_object($arr) {
        if (gettype($arr) != 'array') {
            return;
        }
        foreach ($arr as $k => $v) {
            if (gettype($v) == 'array' || getType($v) == 'object') {
                $arr[$k] = (object)array_to_object($v);
            }
        }
    
        return (object)$arr;
    }
}

}

3.将顶级分类与数据库的分类合并

if(!function_exists('merge')){
    function merge($first=[],$origin=[]){
        $cateList[0]=$first;
        foreach($origin as $key=>$value){
            array_push($cateList,$value);
        }
        return $cateList;
    }
}
4.创建select树状结构
/**
 * @param $arr
 * @param int $depth,当$depth为0的时候表示不限制深度
 * @return string
 */
function make_option_tree_for_select($arr, $depth=0)
{
    $arr = make_tree_with_namepre($arr);
    if (!function_exists('make_options1')) {
        function make_options1($arr, $depth, $recursion_count=0, $ancestor_ids='') {
            $recursion_count++;
            $str = '';
            foreach ($arr as $v) {
                $str .= "<option value='{$v->id}' data-depth='{$recursion_count}' data-ancestor_ids='".ltrim($ancestor_ids,',')."'>{$v->name}</option>";
                if ($v->pid == 0) {
                    $recursion_count = 1;
                }
                if ($depth==0 || $recursion_count<$depth) {
                    $str .= make_options1($v->children, $depth, $recursion_count, $ancestor_ids.','.$v->id);
                }
            }
            return $str;
        }
    }
    return make_options1($arr, $depth);
}


function make_tree_with_namepre($arr)
{   
    $arr = make_tree($arr);
    if (!function_exists('add_namepre1')) {
        function add_namepre1($arr, $prestr='') {
            $new_arr = array();
            foreach ($arr as $v) {
                if ($prestr) {
                    if ($v == end($arr)) {
                        $v->name = $prestr.'└─ '.$v->name;
                    } else {
                        $v->name = $prestr.'├─ '.$v->name;
                    }
                }
                if ($prestr == '') {
                    $prestr_for_children = '  ';
                } else {
                    if ($v == end($arr)) {
                        $prestr_for_children = $prestr.'   ';
                    } else {
                        $prestr_for_children = $prestr.'│  ';
                    }
                }
                $v->children = add_namepre1($v->children, $prestr_for_children);
                
                $new_arr[] = $v;
            }
            return $new_arr;
        }
    }
    return add_namepre1($arr);
}


if(!function_exists('make_tree')){
    function make_tree($arr, $parent_id=0){
        $new_arr = array();
        foreach($arr as $k=>$v){
            if($v->pid == $parent_id){
                $new_arr[] = $v;
                unset($arr[$k]);
            }
        }
        foreach($new_arr as &$a){
            $a->children = make_tree($arr, $a->id);
        }
        return $new_arr;
    }
}

 当分类较多时可以使用

http://element-cn.eleme.io/#/zh-CN/component/cascader

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值