PHP-无限分类-下拉列表实现

7 篇文章 0 订阅

今天在这简单总结一下php里无限分类的用法,当然在实际项目或者业务中,是一定结合着数据库来完成的,这里我是在做MVC架构练习中,封装了无限分类的Model类来完成的,纠结了一段时间,所以特此写blog总结,无限分类的入门理解

什么是无限级分类?
  无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了。其实我们仔细想一下,生活中的分类简直太多了,中国34个省,每个省有市,有区,这就是无限分类。
  
无限级分类原理简介
  无限分类好像很难操作一样,实际上原理是非常简单的 ,就是递归函数的原理,无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。当然这是最简单的数据库制表方法可以实现的。下面我们举例

数据库简单的表格搭建,这里相信大家都会。。
这里写图片描述

这是最简单的数据表模式,主要就是pid,父亲的ID,以小米的产品举例,可以看到大致只有2级的分类。
接下来熟悉mysql和php的朋友们肯定知道了,我们可以连接数据库,通过方法得到一个资源数组,也就是一个二维数组$array.

我这里是用自己封装的一个db类,提取得到数组
入门的大家,也可以先面向过程,提取

**类的提取**
  /**
     * 正常所有商品分类展示,得到一个数组集合
     * @return array
     */
    public function show(){
        $db = Db::getInstance();
        $res = $db->query("select * from tb_category");
        if(is_resource($res)) {
            $arr = $db->fetchAll($res);
        }
        return $arr;
    }

**连接提取**

<?php
    require_once('config.php');
    //连接数据库
    $con = @mysql_connect(HOST,USERNAME,PASSWORD) or die('连接数据库失败!');
    //选择数据库
    @mysql_select_db("db_info");
    //定义字符集
    mysql_query("set names utf8");

?>

那么我们此次的目的是得到什么呢?没错,就是比较常用的一个下拉列表,在后台管理的时候,常会用到,我这边也是用封装的类提取的,我会简单讲一下.

我们的目标:
这里写图片描述

在上面我们用得到的二维数组,进行一个简单的数组变换操作即可

  public function getList(&$result=array(),$pid=0,$spac=0){
        $spac=$spac+4;
        foreach($this->show() as $value){
            if($value['pid']==$pid){
                $value['type'] = str_repeat('&nbsp;',$spac)."|--".$value['type'];
                $result[] = $value;
                $this->getList($result,$value['id'],$spac);
            }
        }
        return $result;
    }

我这用到的是一个类方法,直接当作函数来理解即可
传入三个可选参数,一个引用的数组参数,一个默认的pid,一个空格符计数

原理:
遍历这个这个二维数组,当它的父级pid和顶级0相同时候,提取数组名字,重新编辑,加上前缀,放回去,然后再自己调用自己,完成一次递归,到下一次,如果有下一级别的pid,则继续调用,这样就能简单实现效果,得到一个树形结构的新的二维数组$result!

最后我再将这个二维数组进行加工,放在下拉列表的标签里,遍历输出字符串到前台,或者html结构中,就可以完成上面我们要的效果了!

public function displayList($id=0){
        $str = "";
        $result = $this->getList();
        //这里去更新部分的展示数据,用其中的pid去对比
        $arr = $this->update($id);
        if($id!=0) {
            //当不需要编辑时候,在查询页面正常显示下拉列表
            foreach ($result as $value) {
                //这里特别注意,在model部分判断一把,选中的编辑pid和展示的下拉id相同时候选中
                if($value['id']==$arr['pid']) {
                    $str .= "<option value='{$value['id']}' selected>{$value['type']}</option>";
                }
                else{
                    $str .= "<option value='{$value['id']}'>{$value['type']}</option>";
                }
            }
            return $str;
        }
        else{
            foreach ($result as $value) {
                $str .= "<option value='{$value['id']}'>{$value['type']}</option>";
            }
            return $str;
        }

        }

这是最简答级别的无限分类技术,当然在数据庞大的时候,会有其他的方法可以帮助我们实现不同的效果,我这里是在做mvc架构搭建时候,用smarty模版展示,遇到的无限分类小问题,在此解决,深刻理解,并分享给大家,仅供参考学习。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的三级下拉列表的 AJAX 实现代码示例,不使用 PHP: HTML 代码: ```html <select id="province"> <option value="">请选择省份</option> <option value="1">北京市</option> <option value="2">上海市</option> <option value="3">广东省</option> <!-- 其他省份选项 --> </select> <select id="city"> <option value="">请选择城市</option> </select> <select id="district"> <option value="">请选择地区</option> </select> ``` JavaScript 代码: ```javascript $(document).ready(function() { // 当省份下拉列表改变时触发 AJAX 请求 $('#province').change(function() { var province_id = $(this).val(); if (province_id != '') { $.ajax({ url: 'get_city.json', type: 'get', data: {province_id: province_id}, dataType: 'json', success: function(data) { var options = '<option value="">请选择城市</option>'; for (var i = 0; i < data.length; i++) { options += '<option value="' + data[i].id + '">' + data[i].name + '</option>'; } $('#city').html(options); $('#district').html('<option value="">请选择地区</option>'); }, error: function() { alert('获取城市列表失败!'); } }); } else { $('#city').html('<option value="">请选择城市</option>'); $('#district').html('<option value="">请选择地区</option>'); } }); // 当城市下拉列表改变时触发 AJAX 请求 $('#city').change(function() { var city_id = $(this).val(); if (city_id != '') { $.ajax({ url: 'get_district.json', type: 'get', data: {city_id: city_id}, dataType: 'json', success: function(data) { var options = '<option value="">请选择地区</option>'; for (var i = 0; i < data.length; i++) { options += '<option value="' + data[i].id + '">' + data[i].name + '</option>'; } $('#district').html(options); }, error: function() { alert('获取地区列表失败!'); } }); } else { $('#district').html('<option value="">请选择地区</option>'); } }); }); ``` JSON 数据: get_city.json ```json [ {"id":1, "name":"北京市"}, {"id":2, "name":"上海市"}, {"id":3, "name":"广州市"}, {"id":4, "name":"深圳市"} // 其他城市列表 ] ``` get_district.json ```json [ {"id":1, "name":"东城区"}, {"id":2, "name":"西城区"}, {"id":3, "name":"朝阳区"}, {"id":4, "name":"海淀区"} // 其他地区列表 ] ``` 这个例子中,当省份下拉列表改变时,会触发 AJAX 请求,查询对应的城市列表并更新城市下拉列表。当城市下拉列表改变时,会触发另一个 AJAX 请求,查询对应的地区列表并更新地区下拉列表。两个 AJAX 请求都是通过访问 JSON 文件获取数据,因此不需要使用 PHP

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值