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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(2)
Oct 09 PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
Oct 22 PHP
基于php在各种web服务器的运行模式详解
Jun 03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
Jun 23 PHP
基于PHP制作验证码
Oct 12 PHP
php版银联支付接口开发简明教程
Oct 14 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
PHP基于mcript扩展实现对称加密功能示例
Feb 21 PHP
利用PHP如何统计Nginx日志的User Agent数据
Mar 06 PHP
yii2的restful api路由实例详解
May 14 PHP
PHP常用函数之base64图片上传功能详解
Oct 21 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
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
2013/12/24 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
js实现选中页面文字将其分享到新浪微博
2015/11/05 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
基本DOM节点操作
2017/01/17 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
[02:08]2018年度CS GO枪械皮肤设计大赛优秀作者-完美盛典
2018/12/16 DOTA
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
数控专业毕业生求职信范文
2013/09/21 职场文书
好军嫂事迹材料
2014/01/15 职场文书
小溪流的歌教学反思
2014/02/13 职场文书
商铺租赁意向书
2014/04/01 职场文书
安全生产管理责任书
2014/04/16 职场文书
安全责任书模板
2014/07/22 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
HTML中的表格元素介绍
2022/02/28 HTML / CSS