thinkphp无限级分类的实现方案

普通的方法(采用for和foreach)

        foreach($data as $k=>$v){        //str_repeat()函数用于把字符串重复指定的次数
            $data[$k]['title']=str_repeat('---',$v['type']-1).$v['title'];
        }

无限级分类的设计思路:

为了能够使得栏目的管理更加动态化,在这里可以设置添加栏目,添加的数据库中设计一个名为pid的字段,便于新添加的栏目可以找到他的父栏目。如果是顶级的栏目,则pid为0。再提取数据显示的时候,后台数据库中设置有type字段,用于标识该栏目的等级,在数据显示的时候用str_repeat()函数在前面加上‘-----’,来区分他们的等级。

这个时候的排序显得非常的重要,并且此方法没办法很好的把父级和子级联系在一起,不建议使用

排序

添加的时候为了更加方便的直观的显示哪个栏目下有什么子栏目,可以选择在里面设置一个sorts排序字段,用于排序。在前端,为了能够方便排序。需要表单提交全部的排序的内容。前端的话只需要在表单input的name属性里加入一个数组名。

<input type="hidden" name="id[]" value="{$arr.id}"/>
<input type="text" value="{$arr.sorts}" style="width: 40px;height: 40px;text-align: center" name="sorts[]"/>

然后后台进行接受,同样用for和foreach进行循环操作和遍历

 //把新的获得的排序的信息储存到数据库中
        $arr=$_post;        for($i=0;$i<count($arr['id']);$i++){
            $sort=$model->find($arr['id'][$i]);
            $sort['sorts']=$arr['sorts'][$i];
            $model->save($sort);
        }        //然后根据新的排序信息进行排序
        $data=$model->order('sorts')->select();        foreach($data as $k=>$v){
            $data[$k]['title']=str_repeat('---',$v['type']-1).$v['title'];
        }

用递归的方法实现无限级分类

public function getCate($fIEld='*'){    //用field查询固定字段的数据,若是没有输入实参,则默认查询全部
    //获取到数据库中相关栏目的数据
    $data=$this->field($field)->order('sorts asc')->select();    //调用递归函数
    return $this->getTree($data);
}//根据父级栏目的id去查询子栏目的信息//递归函数,传入全部的栏目信息,用pid来标识栏目所对应的父级的栏目id,level来表示栏目的等级public function getTree($data,$pid=0,$level=0){    //此处应该定义static 如果没有用static,则无法输出全部的栏目信息
    static $tree=array();    foreach($data as $key=>$v){        if($v['pid']==$pid){
            $v['level']=$level;            //str_repeat()函数用于把字符串重复指定的次数,用于区别栏目的等级
            $v['title']=str_repeat('----',$level).$v['title'];
            $tree[]=$v;            $this->getTree($data,$v['id'],$level+1);
        }
    }
}

在用递归函数进行无限级分类的时候建议写在model函数里,这样在控制器中只需要调用模型中的方法即可。再模型中要想调用数据库的查询操作,不用加表明,只需要在模型中使用$this即可。

相关阅读

  • emeditor 配置 可以编辑 hex 16进制文件

    emeditor 配置 可以编辑 hex 16进制文件

    EmEditor 本身支持通过插件/功能配置实现 Hex 编辑功能。 实现方法:使用 EmEditor 的 Hex 模式EmEditor 内置了 Hex 编辑功能,无需安装第三方插件,只需简单配置即可启用,以下是完整的操作步骤: 步骤...

    2026.02.03 20:59:22作者:wintopTags:emeditorhex
  • RTX 3060(12GB显存)总结 PDF内容的智能大模型架构方案

    RTX 3060(12GB显存)总结 PDF内容的智能大模型架构方案

    显卡:RTX 3060(12GB显存)功能需求:“PDF文本总结”。下面是最优、效率最高的模型,同时明确部署方式和调优技巧,让总结速度和效果达到最佳平衡。 核心结论:最优模型选择对你的场景来说,Qwen2.5-7B-Instruct(通义...

    2026.01.22 20:04:09作者:wintop
  • python 多线程任务(下载)水平扩展线程

    python 多线程任务(下载)水平扩展线程

    方案架构说明这个方案由两个主要组件构成:任务分发器 (TaskDistributor)从 MySQL 数据库中获取待下载的文件将下载任务放入 Redis 队列标记文件状态为 "处理中"工作节点 (DownloadWork...

    2025.06.08 22:01:56作者:wintopTags:python
  • Python库实现PDF转HTML方法,可以提取目录TOC

    Python库实现PDF转HTML方法,可以提取目录TOC

    在Python中,要识别PDF中的目录(Table of Contents, TOC),通常有两种场景:直接提取PDF内置的书签(Bookmarks):如果PDF本身带有目录书签(例如电子书、技术文档),可以直接提取。自动分析文本结构推断目...

    2025.03.31 22:14:54作者:wintopTags:pythonpdf
  • grok beta 模型转发php版本,测试通过

    grok beta 模型转发php版本,测试通过

    <?php // 禁用输出缓冲 while (ob_get_level()) {     ob_end_clean(); } ob_implicit_fl...

    2024.11.26 20:32:33作者:wintop
  • FastAdmin如何在表单提交验证时不验证隐藏的元素

    FastAdmin如何在表单提交验证时不验证隐藏的元素

    在FastAdmin中使用的是nice-validator验证器,默认是验证表单中所有添加有验证规则的元素。如何在表单提交时不验证隐藏的元素呢?在nice-validator的选项中有一个ignore的选项。我们配置该值即可。首先打开控制器...

    2024.03.13 13:50:21作者:wintopTags:FastAdmin表单
  • php远程开机,远程唤醒(Wake-on-LAN)局域网电脑代码

    php远程开机,远程唤醒(Wake-on-LAN)局域网电脑代码

    首先要局域网电脑IP为固定IP,这样可以减少获取IP地址的步骤。要使用 PHP 来实现局域网中的远程唤醒(Wake-on-LAN),您可以通过以下步骤来完成:首先,确保您的服务器上已安装 PHP,并且具备发送网络数据包的权限。获取目标计算机...

    2024.03.10 11:33:33作者:wintopTags:php远程唤醒Wake-on-LAN局域网
  • Mysql 联合查询 主表和详细表查询方案

    Mysql 联合查询 主表和详细表查询方案

    mysql 多表联合查询示例:表aindex 为主表:CREATE TABLE `aindex` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,  `name` cha...

    2024.02.02 17:41:12作者:wintop

添加新评论