<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. php+mysql實現無限分類實例詳解

    時間:2025-09-11 18:05:34 php語言 我要投稿

    php+mysql實現無限分類實例詳解

      文章主要介紹了php+mysql實現無限分類的方法,實例分析了mysql數據庫設計、數據庫操作及無限極分類的具體實現步驟,非常具有實用價值,需要的朋友可以參考下。

      本文實例講述了php+mysql實現無限分類的方法。分享給大家供大家參考。具體分析如下:

      1、數據庫通過設置父類ID來進行唯一索引,然后使用函數的遞歸調用實現無限分類;

      2、數據庫設計通過特定格式進行排列,然后使用mysql查詢關鍵函數:concat,程序實現比較簡單,首先我們假設有這樣的一個三級分類,新聞→PHP新聞→PHP6.0出來了.

      如果我們要查找“PHP6.0出來了”這條新聞,我們先點擊新聞,然后再點擊PHP新聞,就可以查出來了,也就是說我們可以通過祖父類一級一級地往下找,反過來我們只要知道一個子類的父類,就可以把它查找出來了,這樣我們在設計數據庫時就可以多設計一個父類id的字段就可以實現無限分類的功能了.

      數據庫代碼如下:

      這里我們建一個表"class"

      復制代碼 代碼如下:

      CREATE TABLE `class` (

      `id` int(11) NOT NULL auto_increment COMMENT '分類id',

      `f_id` int(11) NOT NULL COMMENT '父id',

      `name` varchar(25) collate gbk_bin NOT NULL COMMENT '分類名稱',

      PRIMARY KEY  (`id`)

      ) ENGINE=MyISAM  DEFAULT CHARSET=gbk COLLATE=gbk_bin AUTO_INCREMENT=1 ;

      首先我們往數據庫里插入'新聞'這個大分類,因為'新聞'是最大分類,上面沒有父類了,所以我把它的f_id設置為0.

      復制代碼 代碼如下:

      INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(1, 0, '新聞');/pic/p>

      然后我們再往數據庫里插入'PHP新聞'這個分類,它的父類'新聞'的id是1,所以它的f_id設置為1。

      復制代碼 代碼如下:

      INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(2, 1, 'PHP新聞');

      然后我們再往數據庫里插入'PHP6.0出來了'這個分類,它的父類'PHP新聞'的id是2,所以它的f_id設置為2。

      復制代碼 代碼如下:

      INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(3, 2, 'PHP6.0出來了');

      同理,我們可以這樣一直往下插入分類,也就達到了無限分類.

      我們可以發現插入一個分類的原則關鍵是找到這個分類的父類的id,然后作為這個分類的f_id字段的值.

      假設要插入跟'新聞'同一個級別的分類'技術',也就是說它也是最大分類,上面沒有父類了,那么它的f_id也設置為0;

      復制代碼 代碼如下:

      INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(4, 0, '技術');

      在'技術'下面又有一個分類'PHP技術',那么我們怎么插入呢,首先找到'PHP技術'的父類'技術'的id,然后作為自己的f_id字段的值.

      復制代碼 代碼如下:

      INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(5, 4, 'PHP技術');

      看到這里,想必大家應該都明白怎么往數據庫里插入各個分類了,就不再舉例了,我們已經知道如何往數據庫里插入各個分類了,那又如何把各個分類羅列出來呢?

      php實例代碼如下:

      復制代碼 代碼如下:

      <?php

      header("Content-type:text/html;charset=utf-8");

      $db=new mysqli("localhost","root","","news_php100") ; /pic/p>

      if(mysqli_connect_errno()){

      echo "鏈接失敗:".mysqli_connect_error();

      exit(); }

      $db->query("set names utf8");

      $result=$db->query("select name from class where f_id=0"); /pic/p>

      while($row=$result->fetch_assoc()){

      echo $row['name']."<br>";        /pic/p>

      }

      /pic/p>

      $result=$db->query("select * from class where f_id=1"); /pic/p>

      while($row=$result->fetch_assoc()){

      echo $row['name']."

      ";        /pic/p>

      }

      /pic/p>

      /pic/p>

      /pic/p>

      $result=$db->query("select * from class");

      while($row=$result->fetch_assoc()){

      $arr[]=array($row[id],$row[f_id],$row[name]);    /pic/p>

      }

      function fenlei($f_id=0){     /pic/p>

      global $arr;   /pic/p>

      for($i=0;$i<count($arr);$i++){       /pic/p>

      if($arr[$i][1]==$f_id){         /pic/p>

      echo $arr[$i][2]."<br>"; /pic/p>

      fenlei($arr[$i][0]);   /pic/p>

      }

      }

      }

      ?>

      三個字段id,parentid,name,算法也很簡單遞歸,以前用遞歸的時候很傻,應該說極傻,因為在遞歸中通過查詢數據表來獲得子類的所有,最近開竅了,想到了一個地球人都能想得到的方法,下面是代碼,一個class,代碼如下:

      復制代碼 代碼如下:

      <?php

      class Tree {

      /**

      * 從數據庫查詢出的所有分類信息

      * @var array

      */

      var $arr;

      /**

      * 如下格式

      *  var $arr = array(

      1 => array('id'=>'1','parentid'=>0,'name'=>'一級欄目一'),

      2 => array('id'=>'2','parentid'=>0,'name'=>'一級欄目二'),

      3 => array('id'=>'3','parentid'=>1,'name'=>'二級欄目一'),

      );*/

      /**

      * 輸出結構

      * @var array

      */

      var $tree = array();

      /**

      * 樹形遞歸的深度

      * @var int

      */

      var $deep = 1;

      /**

      * 生成樹形的修飾符號

      * @var array

      */

      var $icon = array('│','├','└');

      /**

      * 生成指定id的下級樹形結構

      * @param int $rootid 要獲取樹形結構的id

      * @param string $add 遞歸中使用的前綴

      * @param bool $parent_end 標識上級分類是否是最后一個

      */

      function getTree($rootid = 0,$add = ”,$parent_end =true){

      $is_top = 1;

      $child_arr = $this->getChild($rootid);

      if(is_array($child_arr)){

      $cnt = count($child_arr);

      foreach($child_arr as $key => $child){

      $cid = $child['id'];

      $child_child = $this->getChild($cid);

      if($this->deep >1){

      if($is_top == 1 && $this->deep > 1){

      $space = $this->icon[1];

      if(!$parent_end)

      $add .=  $this->icon[0];

      else $add .= '  ';

      }

      if($is_top == $cnt){

      $space = $this->icon[2];

      $parent_end = true;

      }else {

      $space = $this->icon[1];

      $parent_end = false;

      }

      }

      $this->tree[] = array('spacer'=>$add.$k.$space,

      'name'=>$child['name'],

      'id'=>$cid

      );

      $is_top++;

      $this->deep++;

      if($this->getChild($cid))

      $this->getTree($cid,$add,$parent_end);

      $this->deep–;

      }

      }

      return $this->tree;

      }

      /**

      * 獲取下級分類數組

      * @param int $root

      */

      function getChild($root = 0){

      $a = $child = array();

      foreach($this->arr as $id=>$a){

      if($a['parentid'] == $root){

      $child[$a['id']] = $a;

      }

      }

      return $child?$child:false;

      }

      /**

      * 設置源數組

      * @param $arr

      */

      function setArr($arr = array()){

      $this->arr = $arr;

      }

      }

      ?>

    【php+mysql實現無限分類實例詳解】相關文章:

    php+mysql結合Ajax實現點贊功能完整實例09-19

    php實現無限級分類實現代碼10-05

    PHP實現無限級分類的方法10-12

    php兩種無限分類方法實例12-08

    C語言棧的表示與實現實例詳解分析03-22

    php+mysql查詢優化簡單實例08-07

    Java實現在不同線程中運行的代碼實例詳解11-11

    Java實現多繼承的實例08-26

    php實現偽靜態的方法實例11-30

    • 相關推薦
    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人