談一次php無限極分類的案例

做者:白狼 出處:http://www.manks.top/php_tree_deep.html 本文版權歸做者,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。原文有圖片。php

平時開發中或多或少不可避免會遇到無限極分類的問題,由於效率、邏輯等問題也一直使這類問題比較尖銳。今天咱們以yii2框架爲基礎,欄目無限極爲例,對這個問題進行一個簡單的處理。html

首先咱們有一張欄目數據表 treeweb

表結構以下圖(原文有圖)數據庫

看上去表結構很簡單。json

咱們插入幾條測試數據yii2

INSERT INTO `tree` 
(`id`, `parent_id`, `name`) 
VALUES 
(1, 0, 'A'), 
(2, 0, 'B'), 
(3, 1, 'a'), 
(4, 3, 'aa'), 
(5, 2, 'b'), 
(6, 4, 'aaa');

樹形結構大體以下數據結構

|A 
|--a 
|----aa 
|------aaa 
|B 
|--b

這也正是咱們所須要的數據結構形式,下面咱們來看看如何處理纔可以獲得所須要的結果。
app

咱們前面也說了,以yii2爲基礎,所以咱們的寫法也按照面向對象的規則來框架

class tree { 
    //訪問index查看樹形結構 
    public function actionIndex () { 
        $data = self::getTree(); 
        //爲了方便測試,咱們這裏以json格式輸出 
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 
        return $data; 
    } 
    //獲取樹 
    public static function getTree () { 
        //這裏咱們直接獲取全部的數據,而後經過程序進行處理 
        //在無限極分類中最忌諱的是對數據庫進行層層操做,也就很容易形成內存溢出 
        //最後電腦死機的結果 
        $data = static::find()->all(); 
        return self::_generateTree($data); 
    } 
    //生成樹 
    private static function _generateTree ($data, $pid = 0) { 
        $tree = []; 
        if ($data && is_array($data)) { 
            foreach($data as $v) { 
                if($v['parent_id'] == $pid) { 
                    $tree[] = [ 
                        'id' => $v['id'], 
                        'name' => $v['name'], 
                        'parent_id' => $v['parent_id'], 
                        'children' => self::_generateTree($data, $v['id']), 
                    ]; 
                } 
            } 
        } 
        return $tree; 
    } 
}

咱們訪問下tree/index看看,效果圖以下yii


這樣咱們能夠看到一個很清晰的樹形結構圖,也就是咱們最終所須要的。

相關文章
相關標籤/搜索