PHP 无限分类的具体原理分析

本贴最后更新于 1795 天前,其中的信息可能已经事过景迁

对于初学 PHP 语言的朋友来说,PHP 还有很多东西需要深入的探究。只有在不断的问题处理中才能掌握其中的真挚。什么是 PHP 无限分类呢?就像 windows 下新建一个文件夹,在新建的文件夹下又可以新建一个文件夹,这样无限循环下去,无限分类也是这样,父类可以分出它子类,子类又可以分出它的子类,这样一直无限循环下去。

那 PHP 又是如何实现它的无限分类的呢?如何把它的各个分类一一列出来呢?
首先我们假设有这样的一个三级分类,新闻 →PHP 新闻 →PHP6.0 出来了。
如果我们要查找“PHP6.0 出来了”这条新闻,我们先点击新闻,然后再点击 PHP 新闻就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反过来我们只要知道一个子类的父类,就可以把它查找出来了。这样我们在设计数据库时就可以多设计一个父类 id 的字段就可以实现 PHP 无限分类的功能了。

//我们建一个表"class"  
CREATE TABLE `class` (  
`id` int(11) NOT NULL auto_increment COMMENT '分类id',  
`f_id` int(11) NOT NULL COMMENT '父id',  
`name` varchar(25) collate gbk_bin NOT NULL COMMENT '分类名称',  
PRIMARY KEY (`id`)  
) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_bin AUTO_INCREMENT=1 ;  
  
//首先我们往数据库里插入‘新闻’这个大分类,因为‘新闻’是最大分类,上面没有父类了,所以我把它的f_id设置为0  
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(1, 0, '新闻'); //id这个字段是自动增长的,可以不写值。  
  
//然后我们再往数据库里插入‘PHP新闻’这个分类,它的父类‘新闻’的id1,所以它的f_id设置为1  
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(2, 1, 'PHP新闻');  
  
//然后我们再往数据库里插入‘PHP6.0出来了’这个分类,它的父类‘PHP新闻’的id2,所以它的f_id设置为2  
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(3, 2, 'PHP6.0出来了');  
  
//同理,我们可以这样一直往下插入分类,也就达到了PHP无限分类。  
//我们可以发现插入一个分类的原则关键是找到这个分类的父类的id,然后作为这个分类的f_id字段的值。  
//假设要插入跟‘新闻’同一个级别的分类‘技术’,也就是说它也是最大分类,上面没有父类了,那么它的f_id也设置为0;  
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(4, 0, '技术');   
  
//在‘技术’下面又有一个分类‘PHP技术’,那么我们怎么插入呢,首先找到‘PHP技术’的父类‘技术’的id,然后作为自己的f_id字段的值。  
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(5, 4, 'PHP技术');

我们已经知道如何往数据库里插入各个分类了,那又如何把各个分类罗列出来呢?

1.  < ?php 
2.  header("Content-type:text/html;charset=utf-8");   
3.  $db=new mysqli("localhost","root","","news_php100") ;   
    //实例化一个数据库连接。使用这个前一定要确保已经加载了mysqli类库,  
    或者用mysql_connect这个方式连接。   
4.  if(mysqli_connect_errno()){  
5.  echo "链接失败:".mysqli_connect_error();  
6.  exit(); }   
7.  $db->query("set names utf8");  
8.  $result=$db->query("select name from class where f_id=0");   
    //查找f_id=0的分类,也就是查找每一个大类。  
9.  while($row=$result->fetch_assoc()){  
10.  echo $row['name']."< br>"; //这样就把每个大类循环出来了。  
11.  }  
12.  //同样我们可以把新闻的子类循环出来。  
13.  $result=$db->query("select * from class where f_id=1");   
    //查找f_id=1的分类,也就是查找‘新闻’的子类。  
14.  while($row=$result->fetch_assoc()){  
15.  echo $row['name']."  
16.  "; //这样就把‘新闻’的子类循环出来了。注意:只是子类,不包括孙子类。  
17.  }  
18.  //写到这里,我们会发现一个问题,如果这个分类是10级分类,难道我们要写  
    10个循环把它每个子类循环出来?如果是更多级分类呢,这样写显然是不现实的。  
19.  //那又有什么办法解决呢?我们可以写一个递归的函数,把f_id作为参数传入,  
      
    不断循环每一个f_id的值,也就是说把每一个f_id值的子类循环出来。  
20.  //首先我们把各个分类的值保存在一个二维数组中,在下面的递归函数里有用。  
21.  $result=$db->query("select * from class");  
22.  while($row=$result->fetch_assoc()){  
23.  $arr[]=array($row[id],$row[f_id],$row[name]); //每一行保存一个  
    分类的id,f_id,name的信息。  
24.  }  
25.  function fenlei($f_id=0){ //$f_id初始化为0,也就是从最大分类开始循环.  
26.  global $arr; //声明$arr为全局变量才可在函数里引用。  
27.  for($i=0;$i< count($arr);$i++){ //对每个分类进行循环。  
28.  if($arr[$i][1]==$f_id){ //$arr[$i][1]表示第$i+1个分类的f_id的值。  
    开始$f_id=0,也就是把f_id=0的分类输出来。  
29.  echo $arr[$i][2]."< br>"; //$arr[$i][1]表示第$i+1个分类的name的值。  
30.  fenlei($arr[$i][0]); //$arr[$i][1]表示第$i+1个分类的id的值。进行递归  
    ,也就是把自己的id作为f_id参数把自己的子类再循环出来。  
31.  }  
32.  }  
33.  }  
34.  fenlei(); //使用这个函数.  
35.  ?>

以上代码示例为我们具体讲解了有关 PHP 无限分类的原理及使用方法,希望能对大家有所帮助。

  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 527 关注
  • 无限分类
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
maixiaojie
如果哪天你累了告诉我 我背你。❤️

推荐标签 标签

  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 623 关注
  • CodeMirror
    1 引用 • 2 回帖 • 119 关注
  • OnlyOffice
    4 引用 • 23 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 45 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 295 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 594 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 193 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    53 引用 • 85 回帖
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 6 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 521 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖 • 1 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    313 引用 • 1667 回帖 • 1 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 45 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 452 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 194 关注
  • 笔记

    好记性不如烂笔头。

    304 引用 • 777 回帖
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    70 引用 • 532 回帖 • 712 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 597 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 495 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 54 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 6 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 26 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 439 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    261 引用 • 662 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 269 关注