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 相关文章推荐
php4的session功能评述(一)
Oct 09 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
Aug 01 PHP
php用正则表达式匹配URL的简单方法
Nov 12 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
浅谈php安全性需要注意的几点事项
Jul 17 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
php版银联支付接口开发简明教程
Oct 14 PHP
php版微信自定义回复功能示例
Dec 05 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
PHP匿名函数(闭包函数)详解
Mar 22 PHP
thinkPHP+LayUI 流加载实现功能
Sep 27 PHP
php的单例模式及应用场景详解
Feb 27 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中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
javascript 二维数组的实现与应用
2010/03/16 Javascript
在浏览器中获取当前执行的脚本文件名的代码
2011/07/19 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
改变layer confirm弹窗按钮的颜色方法
2019/09/12 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
详解用python写一个抽奖程序
2019/05/10 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
基层党建工作汇报材料
2014/08/15 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers
golang使用map实现去除重复数组
2022/04/14 Golang