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初学者头疼问题总结
Jul 08 PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
Apr 24 PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 PHP
destoon调用自定义模板及样式的公告栏
Jun 21 PHP
浅谈thinkphp的实例化模型
Jan 04 PHP
PHP中Session可能会引起并发问题
Jun 26 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
PHP中SQL查询语句的id=%d解释(推荐)
Dec 10 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
Aug 15 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
php将字符串转换为数组实例讲解
May 05 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
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
javascript eval和JSON之间的联系
2009/12/31 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
vue ssr 指南详读
2018/06/29 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
数据挖掘之Apriori算法详解和Python实现代码分享
2014/11/07 Python
详解Django中的form库的使用
2015/07/18 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
python 获取图片分辨率的方法
2019/01/08 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
零基础学python应该从哪里入手
2020/08/11 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
八年级生物教学反思
2014/01/22 职场文书
学术会议邀请函范文
2014/01/22 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
离职报告格式
2014/11/04 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书