利用两个for循环实现无限级分类

表:

字段名

字段类型

备注

默认值

id

int

主键 auto-increment

name

varchar

分类名称

pid

int

父类id

0

顶级分类的 pid 默认就是0了。当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,通常的做法是先将所有分类取出来,数据保存到php数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率。

先来构建一个原始数组,这个直接从数据库中查询出来就行:

1. 构建数据

$categories = array( array('id'=>1,'name'=>'电脑','pid'=>0), array('id'=>2,'name'=>'手机','pid'=>0), array('id'=>3,'name'=>'笔记本','pid'=>1), array('id'=>4,'name'=>'台式机','pid'=>1), array('id'=>5,'name'=>'智能机','pid'=>2), array('id'=>6,'name'=>'功能机','pid'=>2), array('id'=>7,'name'=>'超级本','pid'=>3), array('id'=>8,'name'=>'游戏本','pid'=>3), );

目标是将它转化为下面这种结构

电脑 >笔记本 >>超级本 >> 游戏本 > 台式机

手机 > 智能机 > 功能机

用数组来表示的话,可以增加一个 children 键来存储它的子分类:

array( //1对应$categories中的id ,方便直接读取 1 => array( 'id'=>1, 'name'=>'电脑', 'pid'=>0, children=>array( &array( 'id'=>3, 'name'=>'笔记本', 'pid'=>1, 'children'=>array( //此处省略 ) ), &array( 'id'=>4, 'name'=>'台式机', 'pid'=>1, 'children'=>array( //此处省略 ) ), ) ), //其他分类省略 )

2. 处理过程:

$tree = array(); //第一步,将所有的分类id作为数组key,并创建children单元 foreach($categories as $category){ $tree[$category['id']] = $category; $tree[$category['id']]['children'] = array(); } //第二步,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。 foreach ($tree as $key=>$value) { if ($value['pid'] != 0) { $tree[$value['pid']]['children'][] = &$tree[$key]; } } print_r($tree);

注:必须通过引用, 否则不会一次遍历就生成最终的结果.

3. 打印结果如下:

Array ( [1] => Array ( [id] => 1 [name] => 电脑 [pid] => 0 [children] => Array ( [0] => Array ( [id] => 3 [name] => 笔记本 [pid] => 1 [children] => Array ( [0] => Array ( [id] => 7 [name] => 超级本 [pid] => 3 [children] => Array ( ) ) [1] => Array ( [id] => 8 [name] => 游戏本 [pid] => 3 [children] => Array ( ) ) ) ) [1] => Array ( [id] => 4 [name] => 台式机 [pid] => 1 [children] => Array ( ) ) ) ) [2] => Array ( [id] => 2 [name] => 手机 [pid] => 0 [children] => Array ( [0] => Array ( [id] => 5 [name] => 智能机 [pid] => 2 [children] => Array ( ) ) [1] => Array ( [id] => 6 [name] => 功能机 [pid] => 2 [children] => Array ( ) ) ) ) [3] => Array ( [id] => 3 [name] => 笔记本 [pid] => 1 [children] => Array ( [0] => Array ( [id] => 7 [name] => 超级本 [pid] => 3 [children] => Array ( ) ) [1] => Array ( [id] => 8 [name] => 游戏本 [pid] => 3 [children] => Array ( ) ) ) ) [4] => Array ( [id] => 4 [name] => 台式机 [pid] => 1 [children] => Array ( ) ) [5] => Array ( [id] => 5 [name] => 智能机 [pid] => 2 [children] => Array ( ) ) [6] => Array ( [id] => 6 [name] => 功能机 [pid] => 2 [children] => Array ( ) ) [7] => Array ( [id] => 7 [name] => 超级本 [pid] => 3 [children] => Array ( ) ) [8] => Array ( [id] => 8 [name] => 游戏本 [pid] => 3 [children] => Array ( ) ) )

优点:关系清楚,修改上下级关系简单。

缺点:使用PHP处理,如果分类数量庞大,效率也会降低。

欢迎大家阅读《PHP实现无限极分类_php》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码

原创文章,转载请注明: 转载自搞代码

微信 赏一包辣条吧~

支付宝 赏一听可乐吧~

php代码实现无限极分类,PHP实现无限极分类_php相关推荐

  1. php无极限分类讲解,php无限极分类入门教程

    这篇文章主要介绍了PHP无限极分类函数的实现方法,结合实例形式详细分析了php实现无限极分类的具体思路.实现代码与相关注意事项,需要的朋友可以参考下本文实例讲述了PHP无限极分类函数的实现方法.分享给 ...

  2. php无限极 left right,php无限极分类实现的两种解决方法

    本篇文章介绍了,在php中无限极分类实现的两种解决方法.需要的朋友参考下 method of classify one<?php /* reader: 这是自己写的无限极分类实现方法 里面的编辑 ...

  3. 故障诊断分类 matlab代码 轴承内圈、外圈、滚动体故障分类

    故障诊断分类 matlab代码 轴承内圈.外圈.滚动体故障分类 (1)故障样本的时域.频域.时频域.熵等特征提取: (2)BP网络或者SVM模型训练与测试 (3)输出测试样本分类准确率 成套代码,注释 ...

  4. 朴素贝叶斯(西瓜数据集分类,社区恶意留言分类,垃圾邮件分类,新浪新闻分类),AODE分类器 代码实现

    朴素贝叶斯(西瓜数据集分类,社区恶意留言分类,垃圾邮件分类,新浪新闻分类),AODE分类器 代码实现 以下代码为本人学习后,修改或补充后的代码实现,数据集和原代码请参考:https://github. ...

  5. 极域脱控破解分析+代码实现(杀死和重启,挂起和恢复,解除全屏按钮限制,获取极域安装路径,极域密码破解)

    免责声明:以下内容仅供学习使用 本文的工具成品下载见githubmythwarehelper仓库,附加资源也在内 已完成功能:杀死极域,获取极域安装路径,从注册表破解极域密码,重启极域,挂起极域,恢复 ...

  6. Python机器学习实验二:1.编写代码,实现对iris数据集的KNN算法分类及预测

    Python机器学习实验二:编写代码,实现对iris数据集的KNN算法分类及预测 1.编写代码,实现对iris数据集的KNN算法分类及预测,要求: (1)数据集划分为测试集占20%: (2)n_nei ...

  7. 【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)

    文章目录 前言 一.数据准备 二.训练 三.结果 前言 Imagenet是计算机视觉的经典分类比赛,但是Imagenet数据集本身太大了,我们穷学生没有这么大的算力,2016年google DeepM ...

  8. LESSON 10.110.210.3 SSE与二分类交叉熵损失函数二分类交叉熵损失函数的pytorch实现多分类交叉熵损失函数

    在之前的课程中,我们已经完成了从0建立深层神经网络,并完成正向传播的全过程.本节课开始,我们将以分类深层神经网络为例,为大家展示神经网络的学习和训练过程.在介绍PyTorch的基本工具AutoGrad ...

  9. Keras之DNN:基于Keras(sigmoid+binary_crossentropy+predict_proba)利用DNN实现分类预测概率——DIY二分类数据集预测新数据点

    #Keras之DNN:基于Keras(sigmoid+binary_crossentropy+predict_proba)利用DNN实现分类预测概率--DIY二分类数据集&预测新数据点 目录 ...

  10. php遍历子分类的函数,emlog程序获取主分类下的所有子分类ID函数

    emlog程序获取主分类下的所有子分类ID函数 蓝叶    网站设计    2021-01-04    208    0评论 emlog程序在制作模版时,需要增加一些自定义的列表调用,只设置主分类ID ...

最新文章

  1. python待遇如何-Python薪资待遇到底是多少?老男孩python学习
  2. linux内核网络协议栈--发送流程及函数(十)
  3. 【错误记录】Android Studio 配置 AspectJ 报错 ( Failed to create Jar file C:\xxx\aspectjtools-1.8.10.jar. )
  4. ios app提交之前需要哪几个证书
  5. 云炬WEB开发笔记2-5 chrome调试工具
  6. bzoj4563放棋子
  7. 自由轴法 matlab,一种自由轴法RLC测量电路设计
  8. Java自动装箱和拆箱
  9. 移动办公之路的行业探索
  10. jquery 图像滑块_jQuery CSS图像滑块–自行编写代码
  11. SQLSERVER数据库所有者SID问题
  12. 解决输入框中文英文长度限制不同的情况
  13. java 内存分析 工具_Java程序内存分析:使用mat工具分析内存占用 - 王爵的技术博客...
  14. 熊出没机器人光头强_熊出没:光头强除了3个真名,还有6个外号,第4个最让人心酸...
  15. GAN介绍 - GAN是如何工作的?
  16. Simulink模块介绍
  17. java爬虫正则表达式_Java爬虫预热之正则表达式 - 菜鸟头头
  18. 2022-BNUZ-IT节程序设计竞赛网络赛题解
  19. Charles抓包(数据)
  20. 3650m5设置u盘启动_联想启天M415设置u盘启动步骤(支持uefi/bios双启动)

热门文章

  1. 时间加减的linux语句,Linux date日期格式及加减运算
  2. 动画☀️Unity最新程序化动画绑定(Animation Rigging)
  3. java中poi 生成表格报扩展名无效
  4. 设计ESP8266-03开发板的第一步
  5. Java代码生成器codeMan重磅更新——添加权限管理模块生成功能,实现动态菜单和按钮级别的权限控制
  6. android 椭圆轨迹旋转,css3实现椭圆轨迹旋转
  7. APP - 一个设置,让微信聊天背景清晰10倍
  8. 2016深圳房价上涨有感
  9. win10无法设置移动热点
  10. C++基础之static关键字(1)--静态局部变量详解