1. 程式人生 > >PHP 無限級分類資料庫設計及實現

PHP 無限級分類資料庫設計及實現

♖背景

  • 最近複習演算法,在此對無限級分類的實現方法稍作整理,當然也是參考了道友的經驗,目測適合實際的專案應用,當然,也有不少公司的筆試題還會涉及到呢,有何問題,歡迎各位道友指摘 …

操作環境:Win10
使用語言:PHP
使用框架:ThinkPHP 3.2.3

♘前期準備

①. 首先,實現無限級分類的方式有:

  1. 以父ID設計,運用遞迴實現的方式
  2. 以全路徑實現的無限分類方式

②. 其次,資料表設計思路

  • 對應於上述的兩種實現方式,那麼在資料表設計時也可以有兩種方式,參考所給的資料表截圖
  1. 如果採用 父ID方式,欄位只需使用 "id,pid,cate_name" 的主要三個即可
  2. 如果採用 全路徑方式
    , 欄位只需使用 "id,cate_name,path "的主要三個即可,注意:full_path 其實只作參考即可

♗程式碼實現

  • 此處,講解幾個核心方法,完整程式碼可根據後面的附錄進行下載參考,請注意此處提及的核心處理程式碼都在檔案ZmModel.class.php

①. 父ID 方式

  • 核心處理程式碼如下,注意引數備註資訊,便於正確的呼叫
 /**
     * 資料庫設計 遞迴方式 獲取無限極分類資料 由上到下進行獲取
     * @param int $pid      父級ID,預設為根級分類 0
     * @param int $sel_id   所選中的分類ID,多用於前端 selected 標識
     * @param array $result 陣列整合
     * @param int $spac     空格間隔,便於前端縮排顯示分類所屬級別
     * @return array
     */
    public function deepCatesForDown($pid = 0,$sel_id = 0,&$result = [],$spac = 0){
        //空格數目
        $spac += 2;
        //從資料表中獲取 父級ID為所需 pid 的全部資料
        $cateList = $this->db_cate
            ->where("pid = $pid")
            ->select();
        //TODO 進行遍歷處理
        foreach ($cateList as $key => $value){
            //判斷 selected 屬性
            if ($sel_id == $value['id']){
                $selectedStr = "selected";
            }else{
                $selectedStr = "";
            }
            $cateList[$key]['cate_name'] = str_repeat('  ',$spac)
                .'|--'.$cateList[$key]['cate_name'] ;
            $cateList[$key]['selected'] = $selectedStr;
            $result[] = $cateList[$key];
            //TODO 此處進行了遞迴操作
            $this->deepCatesForDown($value['id'],$sel_id,$result,$spac);
        }
        return $result;
    }
  • 控制器呼叫參考:
$zmModel = new ZmModel();
$cateListDown = $zmModel->deepCatesForDown(0,6);
$this->assign('cateListDown',$cateListDown);
$this->display();
  • 前端Html資料顯示參考:
<h4>遞迴方式獲取 無限級分類資料</h4>
<select>
    <volist name="cateListDown" id="vo">
        <option {$vo.selected}>{$vo.cate_name}</option>
    </volist>
</select>

②. 全路徑實現方式

  • 對應參考上面的介紹方式,核心處理程式碼如下
 /**
     * 全路徑方式 獲取無限極分類資料 由上到下進行獲取
     * @return array
     */
    public function deepCatesFullPathForDown(){
        //注意排序方式 自動按要求進行排列
        $cateList = $this->db_cate
            ->field("id,cate_name,path,concat(path,',',id) full_path")
            ->order('full_path asc')
            ->select();
        $result = [];
        //遍歷資料 方法同上
        foreach ($cateList as $key => $value){
            $deep = explode(',',trim($value['full_path'],','));
            $cateList[$key]['cate_name'] = str_repeat('&nbsp;&nbsp;',count($deep))
                ."|--".$cateList[$key]['cate_name'];
            $result[] = $cateList[$key];
        }
        return $result;
    }
  • 呼叫及前端顯示程式碼參考同上

♔實現效果

  • 上述的參考程式碼,只做了下拉框的實現參考,對於全連結方式的實現可直接參考原始碼

在這裡插入圖片描述

☠ 附錄

相關推薦

PHP 無限分類資料庫設計實現

♖背景 最近複習演算法,在此對無限級分類的實現方法稍作整理,當然也是參考了道友的經驗,目測適合實際的專案應用,當然,也有不少公司的筆試題還會涉及到呢,有何問題,歡迎各位道友指摘 … 操作環境:Wi

php無限分類實現評論回覆

經常在各大論壇或新聞板塊詳情頁面下邊看到評論功能,當然不單單是直接發表評論內容那麼簡單,可以對別人的評論進行回覆,別人又可以對你的回覆再次評論或回覆,如此反覆,理論上可以說是沒有休止,從技術角度分析很容易想到運用無限級分類技術儲存資料,運用遞迴獲取評論層級結構

PHP無限分類實現(不使用遞迴)

無限級分類在開發中經常使用,例如:部門結構、文章分類。無限級分類的難點在於“輸出”和“查詢”,例如 將文章分類輸出為<ul>列表形式; 查詢分類A下面所有分類包含的文章。 1.實現原理 在《無限級分類實現思路》一文中介紹了幾種常見的實現方法,各有利弊。其中“改進前序遍歷樹”資料結構

MySQL基礎入門學習【9】無限分類設計

父親 連接 參照物 insert gpo 平板電視 生活電器 type mysql 比如: 圖書/小說、文學.../四大名著、戲曲.../... 理論上可以設計很多張表; 但是隨著分類逐步增多,這些表的數目不可能無限擴展; 所以對於無限級分類表一般我們采用如下形式(通過自身

MySQL技巧(二)——無限分類設計

無限級分類表的設計(掌握'自身連線') 類似圖書這種,會有很多種分類,而且在現實生活中這種分類會無限的往下分,所以不可能每有一個分類就建立一個分類表。應該使用下面這種語句    DROP TABLE IF EXISTS tdb_goods_types; CREATE TABLE tdb_goods

php無限分類實踐

1.先設計好資料庫新增好分類資料 具體設計可以看這個PHP無限級分類設計 可以隨便扒一個顯示多級分類的導航欄 2.控制器關鍵程式碼 先寫個三級分類的 多級就多次迴圈即可 public function index() { $type1=Db::n

php 無限分類 遞迴+sort排序 和 非遞迴

1 先總結非遞迴 資料表: id name pid path 1 php 0 0 2 mysql 0 0 3 linux

Mysql千萬資料分表設計實現方案(2)附一致性雜湊原理解析

首先,接著上篇博文:Mysql千萬資料級分表設計及實現方案已經分析了自增id作分表key和全域性服務id(16位)作分表key進行分表的兩種設計方案。自增id優勢在於簡單,直接雜湊取模即可分表完成。根據

mysql千萬資料分表設計實現方案

    針對系統資料表日漸增長的資料量,分庫分表是減少資料庫壓力,增加db操作效率的常見解決方案。就目前專案系統而言,資料量級基本多張表已達3kw至6kw的量級。下面對筆者針對系統db結構,結合O2O業務特性整理的分表設計思路及實踐方案的討論。 設計思路: 1、首先確

PHP實現無限分類

RR set pan src 浙江省 IT bubuko func 無限 function generateTree(){ $items = array( 1 => array(‘id‘ => 1, ‘pid‘

php實現無限分類的兩種方式

@param HP 獲取 velt 分類 get gets key turn 一、梯式: 代碼: /* @desc:獲取梯式分類 @param data 需要轉換的數據 @param pkey 上級的鍵名 @param key 主鍵名 @param pid 頂級id @p

php 遞迴函式的三種實現方式 php利用遞迴函式實現無限分類

遞迴函式是我們常用到的一類函式,最基本的特點是函式自身呼叫自身,但必須在呼叫自身前有條件判斷,否則無限無限呼叫下去。實現遞迴函式可以採取什麼方式呢?本文列出了三種基本方式。理解其原來需要一定的基礎知識水品,包括對全域性變數,引用,靜態變數的理解,也需對他們的作用範圍有所理解。遞迴函式也是解決無限級分類的一個很

php遞迴實現無限分類樹(最新版)(轉發自php中文網的大家講道理)

php遞迴實現無限級分類樹(最新版) 程式碼如下: /** * 將資料格式化成樹形結構 * @author Xuefen.Tong * @param array $items * @return array */ function gen

PHP Yii2.0 框架實現無限分類

實現商品無限分類 mysql: 很簡單的資料庫設計,就能完成分類的無限級   效果預覽:     主要方法: 1.首先獲取所有的分類 獲取分類資料庫裡所有的資料 //獲取所有的分類 public function getData()

php 實現不用遞迴的樹形陣列建構函式 無限分類

/** * 建立父節點樹形陣列 * 引數 * $ar 陣列,鄰接列表方式組織的資料 * $id 陣列中作為主鍵的下標或關聯鍵名 * $pid 陣列中作為父鍵的下標或關聯鍵名 * 返回 多維陣列 **/ function find_parent($ar,

php遞迴實現無限分類

一.資料庫設計123456789101112131415161718192021222324252627282930313233343536373839CREATE TABLE `bg_cate` (`cate_Id` int(30) unsigned NOT NULL AU

php遞迴實現無限分類樹(牛逼)

轉載路徑:http://www.php.cn/php-weizijiaocheng-353267.html 無限級樹狀圖可以說是無限級欄目的一個顯著特徵,我們接下來就來看看兩種不同的寫法。 一.資料庫設計 1 2 3

[收集] 各式各樣的 無限分類 的數據庫設計方案

where 數據庫 位數 sel 其中 三級 mat sco tiny 第一種方案: 表為兩張,一張分類表,一張信息表。 表1: `ID` int(10), `cID` tinyint(3) , `title` varchar(255), 表2:`cID` tinyint(

MyBatis無限分類實現的兩種方法--自關聯與map集合

except app exce utf-8 elf findall ldr ati tex 1、這回先創建數據庫吧 下表cid是CategoryId的縮寫,cname是CategoryName的縮寫,pid是parentId的縮寫 無限級分類一般都包含這三個屬性,至少也要包

設計一個無限分類的數據表

互聯 body varchar space 語句 HR creat line pla 設計一個無限級分類的數據表是一個很常見的數據庫任務。比如你寫一個CMS,需要有4,5級分類的欄目,反正就是很普遍,所以還是需要了解一下。下面本專題的所有內容,都是我自己隨手演示寫寫,僅僅供