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
Search Engine Friendly的URL设计
Oct 09 PHP
简单示例AJAX结合PHP代码实现登录效果代码
Jul 25 PHP
PHP 读取大文件的X行到Y行内容的实现代码
Jun 24 PHP
php var_export与var_dump 输出的不同
Aug 09 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
php截取中文字符串函数实例
Feb 23 PHP
composer.lock文件的作用
Feb 03 PHP
PHP 中使用ajax时一些常见错误总结整理
Feb 27 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
Yii2表单事件之Ajax提交实现方法
May 04 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 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 magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
php下Memcached入门实例解析
2015/01/05 PHP
Yii使用技巧大汇总
2015/12/29 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
JQquery的一些使用心得分享
2012/08/01 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
使用JavaScript实现连续滚动字幕效果的方法
2015/07/07 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
vuex提交state&amp;&amp;实时监听state数据的改变方法
2018/09/16 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
微信小程序实现同一页面取值的方法分析
2019/04/30 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
便捷提取python导入包的属性方法
2018/10/15 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
德国PC硬件网站:CASEKING
2016/10/20 全球购物
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
家长给幼儿园的表扬信
2014/01/09 职场文书
终止劳动合同协议书
2014/04/14 职场文书
小学运动会开幕词
2015/01/28 职场文书
观后感的写法
2015/06/19 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python