PHP实现多级分类生成树的方法示例


Posted in PHP onFebruary 07, 2017

本文实例讲述了PHP实现多级分类生成树的方法。分享给大家供大家参考,具体如下:

条件,数据库里分类是按id,fid(父ID)实现多级分类的!

使用方法:

$sql ="XXXXXXXXXX";   //sql语句
$res = $db->Select($sql);  //执行sql
$list=array();
treeList(treeGet($res),$list);  /生成树
print_r($res);  //打印出来看看!

使用结果:

┣推荐新闻啊
┃┣国际新闻
┃┣dfffffg
┃┣ttttttt
┃┃┗yyyyy

代码如下:

/**
* 选择SQL涵数
*
* @access public
* @param Array  $field  字段信息,支持涵数
* @param Array  $table  数据库表
* @param Array  $where  条件
* @return SQL SQL语句
*/
function treeGet($data)
{
  $tmptree=null;
  $tree=$data;
  return treeAddNodeToTree($tmptree,treegetbyuid($tree,0,@$field),$tree);
}
/**
*插入SQL涵数
*
* @access public
* @param Array  $fieldResult  字段信息,支持涵数
* @param Array  $table  数据库表
* @return SQL SQL语句
*/
function treeAddNodeToTree($Node,$miniTree,&$source)
{
  if(is_array($miniTree)) {
    foreach($miniTree as $k=>$v)
    {
      if(!count($miniTree[$k]['child']=treeAddNodeToTree($miniTree[$k],treegetbyuid($source,@$v['id']),$source)))
      {
        unset($miniTree[$k]['child']);
        $miniTree[$k]['leaf']=true; //设置叶结点
      }
    }
    return $Node['child']=$miniTree;
  }
}
function treegetbyuid(&$stree,$uid)
{
  $dtree=array();
  if(is_array($stree)){
    foreach($stree as $k=>$v)
    {
      if($v['fid']==$uid)
      {
        $mytmp=array();
        $mytmp=$v;
        unset($stree[$k]);
        array_push($dtree,$mytmp);
        $mytmp=null;
      }
    }
  }
  return $dtree;
}
/**
*更新SQL涵数
*
* @access public
* @param Array  $fieldResult  字段信息,支持涵数
* @param Array  $table  数据库表
* @param Array  $where  条件
* @return SQL SQL语句
*/
function treeMakeDeep($deep)
{
  $returnValue="";
  for (;$deep;$deep--)
  {
    $returnValue.="┃";
  }
  return $returnValue."┣";
}
function treeList($treeData,&$List)
{
  static $deep=0;
  if(is_array($treeData))
  {
    foreach($treeData as $k=>$v)
    {
      $v['deepValue']=treeMakeDeep($deep);
      $v['deep']=$deep;
      $t=$v;
      unset($t['child']);
      array_push($List,$t);
      if($v['child'])
      {
        ++$deep;
        $optionsNode.=treeList($v['child'],$List);
        $deep--;
      }
    }
    if($lastV=array_pop($List))
    {
      $lastV['deepValue']=str_replace('┣','┗',$lastV['deepValue']);
      array_push($List,$lastV);
    }
  }
}
function treeSelect($tree,$id,$options="child")
{
  switch(strtolower($options))
  {
    case"child":
    $tmpTree=array();
    $deep=-1;
    foreach($tree as $k=>$v)
    {
      if($id==$v['id'])
      {
        array_push($tmpTree,$v);
        $deep=$v['deep'];
      } elseif($deep!=-1)
      {
        if($v['deep']<=$deep)
        {
          break;
        } else
        {
          array_push($tmpTree,$v);
        }
      }
    }
    break;
    case "remove":
    default:
    $tmpTree=array();
    $deep=-1;
    foreach($tree as $k=>$v)
    {
      if($id==$v['id'])
      {
        $deep=$v['deep'];
        continue;
      } elseif($deep!=-1)
      {
        if($v['deep']<=$deep)
        {
          array_push($tmpTree,$v);
          $deep=-1;
        }
        continue;
      }
      array_push($tmpTree,$v);
    }
  }
  return $tmpTree;
}

PS:为方便读者阅读源码,上述代码使用了在线工具http://tools.3water.com/code/3water_php_format进行了格式化处理。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
如何使用动态共享对象的模式来安装PHP
Oct 09 PHP
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
Apr 18 PHP
PHP初学者最感迷茫的问题小结
Mar 27 PHP
php disk_free_space 返回目录可用空间
May 10 PHP
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
解析php中memcache的应用
Jun 18 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
Jun 25 PHP
php中Session的生成机制、回收机制和存储机制探究
Aug 19 PHP
php+MySQL判断update语句是否执行成功的方法
Aug 28 PHP
php导出生成word的方法
Dec 25 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 #PHP
php实现图片按比例截取的方法
Feb 06 #PHP
php实现的中文分词类完整实例
Feb 06 #PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 #PHP
php使用变量动态创建类的对象用法示例
Feb 06 #PHP
PHP单例模式定义与使用实例详解
Feb 06 #PHP
PHP第三方登录―QQ登录实现方法
Feb 06 #PHP
You might like
解析PHP缓存函数的使用说明
2013/05/10 PHP
PHP中文编码小技巧
2014/12/25 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
AngularJS 输入验证详解及实例代码
2016/07/28 Javascript
JavaScript实现经典排序算法之选择排序
2016/12/28 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
2018/03/07 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
python numpy存取文件的方式
2020/04/01 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
彪马英国官网:PUMA英国
2019/02/11 全球购物
八年级生物教学反思
2014/01/22 职场文书
优秀交警事迹材料
2014/01/26 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
九九重阳节致辞
2015/07/31 职场文书
施工安全责任协议书
2016/03/23 职场文书
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers