广

PHP编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-10-18 20:40:03 次阅读 稿源:互联网
    零七广告
    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~闪人~

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告