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 相关文章推荐
Uchome1.2 1.5 代码学习 common.php
Apr 24 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
PHP Session机制简介及用法
Aug 19 PHP
php隐藏实际地址的文件下载方法
Apr 18 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 PHP
PHP安装memcache扩展的步骤讲解
Feb 14 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 PHP
基于PHP实现用户在线状态检测
Nov 10 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
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
$.ajax json数据传递方法
2008/11/19 Javascript
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
jquery禁用右键示例
2014/04/28 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
python模拟鼠标拖动操作的方法
2015/03/11 Python
深入理解python中的atexit模块
2017/03/07 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
John Hardy官方网站:手工设计首饰的奢侈品牌
2017/07/05 全球购物
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
股份合作协议书范本
2014/04/14 职场文书
党内外群众意见范文
2015/06/02 职场文书
团干部培训班心得体会
2016/01/06 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers