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 前一天或后一天的日期
Jun 28 PHP
PHP编码规范之注释和文件结构说明
Jul 09 PHP
php循环检测目录是否存在并创建(循环创建目录)
Jan 06 PHP
基于PHP array数组的教程详解
Jun 05 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
PHP操作文件的一些基本函数使用示例
Nov 18 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
Oct 20 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
May 26 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
PHP微信API接口类
Aug 22 PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 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 飞信好友免费短信API接口开源版
2010/07/22 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
arguments对象
2006/11/20 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
Jquery Easyui日历组件Calender使用详解(23)
2016/12/18 Javascript
react-native使用leanclound消息推送的方法
2018/08/06 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
JavaScript使用canvas绘制随机验证码
2020/02/17 Javascript
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
Python 专题一 函数的基础知识
2017/03/16 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
应届生污水处理求职信
2013/11/06 职场文书
战略合作意向书
2014/07/29 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
党员学习型组织心得体会
2019/06/21 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
Django显示可视化图表的实践
2021/05/10 Python