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

来源:互联网 发布:剑灵人族御姐捏脸数据 编辑:程序博客网 时间:2024/06/05 16:26
帖几个PHP的 无限分类实现想法~<scrīpt type="text/javascrīpt"><--google_ad_client = "pub-6912338070246884";google_alternate_color = "FFFFFF";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "text";//2007-06-15: www.techyou.cngoogle_ad_channel = "5642791638";google_color_border = "FFFFFF";google_color_bg = "FFFFFF";google_color_link = "000000";google_color_text = "000000";google_color_url = "008000";//--></scrīpt><scrīpt type="text/javascrīpt"  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></scrīpt>
#Qb)g0@"]g'R2/X01、做网站的一般都会遇到处理分类的问题, 偶来帖几个处理无限分类的例子
aP;l,Cr#e?M0数据库的结构很简单: PHPChina 开源社区门户5R#cs9JZ1a2S-U
id, fatcher_id, name, ...... PHPChina 开源社区门户3Vy~{0k/,HuF
这样的设计短小精悍,完全满足3NF..可以完全绝大多数要求,OK,让偶们看看这种数据库结构下的程序实现.
Z$OL(D:n?T)oCda01.递归查询数据库 PHPChina 开源社区门户1Q A1~Y2/7^E
最要命的做法~也是最好实现的做法 PHPChina 开源社区门户/y9Hy:W*@f*o
  类别1
6_} @lX0    类别1.1 PHPChina 开源社区门户:C*`-Qj:Mi
      类别1.1.1
$^,p%fb5T-etd1w0    类别1.2 PHPChina 开源社区门户 SpL/_`.v
  类别2
)h? ^Fd3}3K0    类别2.1 PHPChina 开源社区门户B7Q6Q~Fdete?
  类别3
S(Ls O2EQy!S0    类别3.1
8HR'Y$sy)Z0    类别3.2
hKZ5Fk$_0......
Yzr(Ls/"i0为了生成这样的目录结构,程序递归一次就查询一次数据库,在您任何涉及分类的地方(翻页,查询....),数据库都会悲壮地操作硬盘....阿门~so~跳一下吧... PHPChina 开源社区门户vu&W n'W;`;XU
2.查询一次数据库,递归数组生成以上目录结构
iE Q�w)y;F`0帖一个大致的思路 PHPChina 开源社区门户Qq0P6NEA c I2f
function SelectList(&$Data, $RootID = 0')
/xr O8`y b8S0{
@h'm3h#@Gw0     for($i = 0; $i < count($Data); $i++) PHPChina 开源社区门户+L:T~T!|t._2U
     { PHPChina 开源社区门户h4`Lc8a ~oa
           if($Data[$i]['UID'] == $RootID)
H~)lI CpB%k0           { PHPChina 开源社区门户1{Is;QJB2O!|r
                 ......//处理,直接生成HTML或者保存入数组都OK啦 PHPChina 开源社区门户&X/v2IP'n1h'e pK
                 $this->SelectRecursion($Data, $Data[$i]['ID'], $blank, $Match); PHPChina 开源社区门户t`P�F)t5_
           } PHPChina 开源社区门户/r/#iU9F�U&o
     }
OU&lB7g2h r�qY#{ BS0     return $this->Output; PHPChina 开源社区门户`mm.~q3[}
}
X J./-n%` zx1PF0这种强度的递归一般的网站系够用啦~不过碰到BT点的,有几K甚至上W的分类,递归一遍可能要百毫秒以上,在考虑并发的情况下....呵呵~我们再跳一下吧PHPChina 开源社区门户:D)N` j}LE
3.查询一次数据库,非递归生成目录结构
3hQ6amrP0这一步,程序的技巧来了~只对结果遍历一次就能生成上面那样的目录结构,想要把它格式化成网页的显示样式就很方便咯~下面的系别人写的,偶试过完全可行
&/#z4p"D v0function GetArray($RootID = 0) PHPChina 开源社区门户?�[{-Z4Utw
{
(mm k [M0     $Data      = array();
JNK#FJ�u0     $Data      = $tblObj->MapResult($tblObj->Select());
8bV5fi./&D0    $Output = Array(); PHPChina 开源社区门户 QA^P,fJ
    $i = 0;
$I7w7eE(j2eM m(j0    $len = Count($Data);
e~)G*V;xb%B0    if($RootID) PHPChina 开源社区门户 TB/OJ2Gb1D
    { PHPChina 开源社区门户)p_yr'S^
        while($Data[$i]['UID'] != $RootID && $i < $len)      $i++; PHPChina 开源社区门户7U)w Q+/rv)w
    } PHPChina 开源社区门户_*I7XOo)p
    $UpID   = $RootID;     //上个节点指向的分类父ID PHPChina 开源社区门户CqR-mq
    for($cnt = Count($Data); $i < $cnt;)   //历遍整个分类数组
Q3n(t(uZvy5Z0    {
p.BxO4[ GynL0        $j = 0;     //初始化此次分类下子分类数据计数 PHPChina 开源社区门户#c!r0tW4]9~*_:k
        if ($UpID == $RootID)   //在第一次循环时将所有一级分类保存到$Output这个数组中 PHPChina 开源社区门户_5c!U wO/w#`#G
        {
CA-LEr P0UQ0          while($Data[$i]['UID'] == $UpID && $i < $len) //判断上一个节点是否为兄弟节点
%U F8S.k$Yh-maX0          { PHPChina 开源社区门户IEz W(c"s
            $Output[$j] = $Data[$i];                   //保存该节点到Output这个数组中 PHPChina 开源社区门户R e~Ri;] F7j;]
            $tmp[$Data[$i]['ID']] = &$Output[$j]; //并且将该节点ID在Output中的位置保存起来. PHPChina 开源社区门户8A4k!h7TA
            $i++; PHPChina 开源社区门户d!m/X}�v)e}
            $j++; PHPChina 开源社区门户psCS7LD4iI
          }
s/n:Tz9`/|_*p;BM0        }
6f"y} { @'V)h%}0        else
uV6S1bo:g0        {
;T` Mi%RtI0          while($Data[$i]['UID'] == $UpID && $i < $len) PHPChina 开源社区门户d,n.K9/H[-f
          { PHPChina 开源社区门户 g8K6~pX W j,?
            if($tmp[$UpID])
*{~M[d0            {
Ifa)k!b']S�d0                $tmp[$UpID]['Child'][$j] = $Data[$i]; PHPChina 开源社区门户%~6s8pY-s U}
                $tmp[$Data[$i]['ID']] = &$tmp[$UpID]['Child'][$j];   //保存该节点ID在Output中的位置
?.ZAp| B0            }
4n.q?e1a)DQ@lb8Q0            $i++; PHPChina 开源社区门户2`Zxh7n$q0@
            $j++; PHPChina 开源社区门户+A&yz,A"Y,DHj
          } PHPChina 开源社区门户j,Y,AZ9E8E@ny
        } PHPChina 开源社区门户-T#/AG~'Wb
        $UpID = $Data[$i]['UID']; PHPChina 开源社区门户ZbsFn nx
    }
+Cy5B'i9A%l T5R.Y c0    return $Output;
]&Vp&]D{+i?h0  }
%^3Kt;`"P0程序看着好累人啊~这段代码的效率比上一段快了十几倍呢,强度系够大了... PHPChina 开源社区门户i6[;}wdre�o+Q-^
不过....90%的网站用这样的代码都浪费啦~偶遇到过的网站分类一般都在四级以下,那么,还能再优化一下么?........再....再跳一下吧.. PHPChina 开源社区门户AL6c�vF,i
4.从数据库入手~
7z9n.f+eS@#O9y0
稍微改动一下数据库的结构,加一个layer的冗余字段,这个是db desing高手想出来的,偶把他帖出来而已 PHPChina 开源社区门户+asZ+UE S6F Wc
id         name       father_id       layer PHPChina 开源社区门户7E `k8w|i0w
1         总类别       0           000000
4H"q6`W"}#Zi02         类别1           1           010000
#~R#n _$[�{H03         类别1.1         2           010100
#k9z't~#sl/ypfV04         类别1.2         2           010200 PHPChina 开源社区门户 m7jGFD}$Ys0~
5         类别2           1           020000
~ O�Q cI6B/zu?U06         类别2.1         5           020100 PHPChina 开源社区门户#k L/UrG+RSoX%m&x
7         类别3           1           030000 PHPChina 开源社区门户X;R y {l$/7?uQ
8         类别3.1         7           030100 PHPChina 开源社区门户)ruS[5H.q,Derf
9         类别3.2         7           030200 PHPChina 开源社区门户0|e Cz�k�|4G
10         类别1.1.1         3           010101 PHPChina 开源社区门户YMpx!qvr
现在按layer的大小来检索一下:SELECT * FROM Type_table_2 ORDER BY type_layer PHPChina 开源社区门户k7kh&f&u"G R4d
列出记录集如下: PHPChina 开源社区门户,e+k^a-_H
id         name       father_id       layer
N3Rd"}Q.N01         总类别       0           000000 PHPChina 开源社区门户5SPgA!{&|
2         类别1           1           010000
Y`3i|;J)h4T03         类别1.1         2           010100 PHPChina 开源社区门户;n!y;z;PxJ'ko
10         类别1.1.1         3           010101
&o'E$W hU:zG4[7z7k04         类别1.2         2           010200 PHPChina 开源社区门户J7b6zI/Y%a
5         类别2           1           020000
G$o]"f"zs6Y!M9|)Y3z?06         类别2.1         5           020100
:uLVJq2L07         类别3           1           030000 PHPChina 开源社区门户leXSZ5t/g/k
8         类别3.1         7           030100
^�i YLOd�c%~)p09         类别3.2         7           030200 PHPChina 开源社区门户oj;g#eN4l n
看见了么~一次查询连目录结构都生成好咯~,这样程序就轻松很多了,只是多了维护layer字段的工作,这个例程中layer字段每一级能处理99个分类,如果有BT的应用,改大些就行了,呵呵,先分析你的需求吧
(F*V�i#DKe |0OK~OVER~闪人~ 
原创粉丝点击