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
php empty函数 使用说明
Aug 10 PHP
php开发过程中关于继承的使用方法分享
Jun 17 PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
Jun 22 PHP
ThinkPHP的模版中调用session数据的方法
Jul 01 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
PHP书写格式详解(必看)
May 23 PHP
详解laravel安装使用Passport(Api认证)
Jul 27 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
Oct 16 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 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数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
jQuery语法总结和注意事项小结
2012/11/11 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
js简单设置与使用cookie的方法
2016/01/22 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
JS实现百度搜索框
2021/02/25 Javascript
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
Python partial函数原理及用法解析
2019/12/11 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
2014年房地产工作总结范文
2014/11/19 职场文书
政审证明范文
2015/06/19 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL