帖几个PHP的无限分类实现想法~

1、做网站的一般都会遇到处理分类的问题, 偶来帖几个处理无限分类的例子
数据库的结构很简单:
id, fatcher_id, name, ......
这样的设计短小精悍,完全满足3NF..可以完全绝大多数要求,OK,让偶们看看这种数据库结构下的程序实现.

1.递归查询数据库
最要命的做法~也是最好实现的做法
  类别1
    类别1.1
      类别1.1.1
    类别1.2
  类别2
    类别2.1
  类别3
    类别3.1
    类别3.2
......
为了生成这样的目录结构,程序递归一次就查询一次数据库,在您任何涉及分类的地方(翻页,查询....),数据库都会悲壮地操作硬盘....阿门~so~跳一下吧...
2.查询一次数据库,递归数组生成以上目录结构
帖一个大致的思路
function SelectList(&$Data, $RootID = 0')
{
     for($i = 0; $i < count($Data); $i++)
     {
           if($Data[$i]['UID'] == $RootID)
           {
                 ......//处理,直接生成HTML或者保存入数组都OK啦
                 $this->SelectRecursion($Data, $Data[$i]['ID'], $blank, $Match);
           }
     }
     return $this->Output;
}
这种强度的递归一般的网站系够用啦~不过碰到BT点的,有几K甚至上W的分类,递归一遍可能要百毫秒以上,在考虑并发的情况下....呵呵~我们再跳一下吧
3.查询一次数据库,非递归生成目录结构
这一步,程序的技巧来了~只对结果遍历一次就能生成上面那样的目录结构,想要把它格式化成网页的显示样式就很方便咯~下面的系别人写的,偶试过完全可行
function GetArray($RootID = 0)
{
     $Data      = array();

$Data      = $tblObj->MapResult($tblObj->Select());

$Output = Array();
    $i = 0;
    $len = Count($Data);
    if($RootID)
    {
        while($Data[$i]['UID'] != $RootID && $i < $len)      $i++;
    }
    $UpID   = $RootID;     //上个节点指向的分类父ID
    for($cnt = Count($Data); $i < $cnt;)   //历遍整个分类数组
    {
        $j = 0;     //初始化此次分类下子分类数据计数
        if ($UpID == $RootID)   //在第一次循环时将所有一级分类保存到$Output这个数组中
        {
          while($Data[$i]['UID'] == $UpID && $i < $len) //判断上一个节点是否为兄弟节点
          {
            $Output[$j] = $Data[$i];                   //保存该节点到Output这个数组中
            $tmp[$Data[$i]['ID']] = &$Output[$j]; //并且将该节点ID在Output中的位置保存起来.
            $i++;
            $j++;
          }
        }
        else
        {
          while($Data[$i]['UID'] == $UpID && $i < $len)
          {
            if($tmp[$UpID])
            {
                $tmp[$UpID]['Child'][$j] = $Data[$i];
                $tmp[$Data[$i]['ID']] = &$tmp[$UpID]['Child'][$j];   //保存该节点ID在Output中的位置
            }
            $i++;
            $j++;
          }
        }
        $UpID = $Data[$i]['UID'];
    }
    return $Output;
  }

程序看着好累人啊~这段代码的效率比上一段快了十几倍呢,强度系够大了...
不过....90%的网站用这样的代码都浪费啦~偶遇到过的网站分类一般都在四级以下,那么,还能再优化一下么?........再....再跳一下吧..
4.从数据库入手~
稍微改动一下数据库的结构,加一个layer的冗余字段,这个是db desing高手想出来的,偶把他帖出来而已
id         name       father_id       layer
1         总类别       0           000000
2         类别1           1           010000
3         类别1.1         2           010100
4         类别1.2         2           010200
5         类别2           1           020000
6         类别2.1         5           020100
7         类别3           1           030000
8         类别3.1         7           030100
9         类别3.2         7           030200
10         类别1.1.1         3           010101

现在按layer的大小来检索一下:SELECT * FROM Type_table_2 ORDER BY type_layer

列出记录集如下:

id         name       father_id       layer
1         总类别       0           000000
2         类别1           1           010000
3         类别1.1         2           010100
10         类别1.1.1         3           010101
4         类别1.2         2           010200
5         类别2           1           020000
6         类别2.1         5           020100
7         类别3           1           030000
8         类别3.1         7           030100
9         类别3.2         7           030200

看见了么~一次查询连目录结构都生成好咯~,这样程序就轻松很多了,只是多了维护layer字段的工作,这个例程中layer字段每一级能处理99个分类,如果有BT的应用,改大些就行了,呵呵,先分析你的需求吧

OK~OVER~闪人~

(0)

相关推荐

  • 使用PHP数组实现无限分类,不使用数据库,不使用递归.

    复制代码 代码如下: <?php class cat {     public $data; public function __construct()      {         @include "data.php";         $this->data = $class;     } public function CreateSortLevel($fatherlevel)     {         if(empty($fatherlevel))       

  • PHP 无限分类三种方式 非函数的递归调用!

    php无限分类大致有三种方式, 1.数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类: 2.数据库设计通过特定格式进行排列,然后使用mysql查询关键函数:concat.程序实现比较简单: 3.第三种不是太了解, 好像要使用到算法和数据结构进行排列. 今天我主要分享下第二种方式,一开始也是找了很多资料,确实比较难理解.不过最终还是给搞明白了,因此记下随笔,希望通过这篇文章能够帮助到大家. 一.数据库设计: 复制代码 代码如下: -- -- Table structure

  • PHP无限分类代码,支持数组格式化、直接输出菜单两种方式

    复制代码 代码如下: <?php /** +------------------------------------------------ * 通用的树型类 +------------------------------------------------ * @author yangyunzhou@foxmail.com +------------------------------------------------ * @date 2010年11月23日10:09:31 +-------

  • PHP无限分类(树形类)

    复制代码 代码如下: <?php//模拟PHP无限分类查询结果return array(    array(        'id'=>1,        'pid'=>0,        'name'=>'主页'    ),    array(        'id'=>2,        'pid'=>0,        'name'=>'新闻'    ),    array(        'id'=>3,        'pid'=>0,   

  • PHP无限分类的类

    复制代码 代码如下: <?php /**  * @author        YangHuan  * @datetime      * @version        1.0.0  */ /**  * Short description.  *  * Detail description  * @author         * @version      1.0  * @copyright      * @access       public  */ class Tree {     /**

  • php 无限分类的树类代码

    复制代码 代码如下: <?php /** by lenush; */ class Tree { var $data = array(); var $child = array(-1=>array()); var $layer = array(-1=>-1); var $parent = array(); function Tree ($value) { $this->setNode(0, -1, $value); } // end func function setNode ($i

  • php无限分类使用concat如何实现

    一.数据库设计 -- -- Table structure for table `category` -- CREATE TABLE `category` ( `id` int(11) NOT NULL auto_increment, `catpath` varchar(255) default NULL, `name` varchar(255) default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_

  • php无限分类且支持输出树状图的详细介绍

    复制代码 代码如下: <?php/*** 通用的树型类,可以生成任何树型结构*/class tree{    /**    * 生成树型结构所需要的2维数组    * @var array    */    var $arr = array(); /**    * 生成树型结构所需修饰符号,可以换成图片    * @var array    */    var $icon = array('│','├','└'); /**    * @access private    */    var $r

  • php递归实现无限分类生成下拉列表的函数

    复制代码 代码如下: /*------------------ */ //– 递归实现无限分类生成下拉列表函数 //– $tpl->assign('sort_list',createSortOptions ()); //– $tpl->assign('sort_list',createSortOptions ($sort_id)); /*------------------ */ function createSortOptions ($selected=0,$parent_id=0,$n=-

  • 帖几个PHP的无限分类实现想法~

    1.做网站的一般都会遇到处理分类的问题, 偶来帖几个处理无限分类的例子数据库的结构很简单: id, fatcher_id, name, ...... 这样的设计短小精悍,完全满足3NF..可以完全绝大多数要求,OK,让偶们看看这种数据库结构下的程序实现. 1.递归查询数据库 最要命的做法~也是最好实现的做法 类别1 类别1.1 类别1.1.1 类别1.2 类别2 类别2.1 类别3 类别3.1 类别3.2 ...... 为了生成这样的目录结构,程序递归一次就查询一次数据库,在您任何涉及分类的地方

  • thinkphp实现无限分类(使用递归)

    本文实例为大家分享了thinkphp实现无限分类的详细代码,希望对大家学习无限分类有所启发. 数据库:test 数据表:(tp_category): Common/conf/config.php 'DB_CONFIG2' => array( 'db_type' => 'mysql', 'db_user' => 'root', 'db_pwd' => '', 'db_host' => 'localhost', 'db_port' => '3306', 'db_name'

  • Asp.Net实现无限分类生成表格的方法(后台自定义输出table)

    本文实例讲述了Asp.Net实现无限分类生成表格的方法.分享给大家供大家参考,具体如下: 数据结构 monitor_group monitor_grp_id      monitor_grp_name     parent_id       level               childCount       orderby [int,自动递增]           [nvarchar,not null]      [int,not null]  [int,not null]   [int,

  • .Net中实现无限分类的2个例子

    以前总想着搞这个无限分类,今天终于得空好好的看了下,发现实现的原理还是很简单的,数据结构上,用两列(分类编号,上级编号)就可以实现,可是为了联合查询的方便,一般都再增加一列(深度),在这个实例里,我只用了两列,剩下的无非就是递归着对TreeView进行数据绑定而已~~. 复制代码 代码如下: public partial class _Default : System.Web.UI.Page     {         BIL bil = new BIL();         protected

  • 解析thinkphp的左右值无限分类

    以前一直使用父子无限分类,这种分类结构清晰,使用也简单.但若分类数量很大的话,在查询上性能不佳.比如在做导航菜单中,我要根据某一分类查询出整个分类树的话(祖辈).性能消耗是非常大的,要么做递归,要么做多次查询.故,对于分类的数据量很大的情况,我推荐使用左右值,以减少查询上的麻烦. 复制代码 代码如下: _id    /**         +----------------------------------------------------------         * 构造函数     

  • 利用php递归实现无限分类 格式化数组的详解

    我们要做一个商品的无限分类首先数据库字段为:id ----------商品主键idfid ---------- 商品父idname ---------- 商品名最后输出的数组格式为 复制代码 代码如下: <PRE class=php name="code"><PRE class=php name="code">array( 0=>array(  'id'=>1,  'fid'=>0,  'name'=>'法国货'  '

  • PHP无限分类(树形类)的深入分析

    PHP无限分类,Google一下就能找到很多相关资料,思路比较拉风的,也是用得比较多的就是分类表至少有id,pid,name三个字段,id自增表分类,pid为父分类,name为分类名,这样就构成了一棵树,如下,算是我查询分类表得到的结果集. 复制代码 代码如下: <?php//模拟PHP无限分类查询结果return array(    array(        'id'=>1,        'pid'=>0,        'name'=>'主页'    ),    array

  • 基于php无限分类的深入理解

    无限分类是实际开发中经常用到的一种数据结构,一般我们称之为树形结构.题设:类似淘宝的商品分类,可以在任意分类设置其子类. 一.创建`type`数据表`id` 自增长`fid` int(11) 默认(0) ,父节点id`name` varchar(50),分类名称 复制代码 代码如下: CREATE TABLE `type` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `fid` int(11) NOT NULL DEFAULT '0',  `name` v

  • 比较简单实用的PHP无限分类源码分享(思路不错)

    下面一段代码是创建相应数据库的sql代码: 复制代码 代码如下: //////////////   //////无限分类的数据库设计及样例   //////////////   mysql> create database db_kind;   Query OK, 1 row affected mysql> use db_kind;   Database changed   mysql> create table tb_kind(     -> id int not null au

随机推荐