天天看點

無限級分類總結(二)

前言

 前面,我已經寫過一篇關于無限極分類的文章《無限級分類總結》。但在實際開發中,我可能不會選擇那兩種實作方法,而是選擇另外一種更好的實作思路。前面那一種,在一個函數中通過遞歸實作所有分類的查詢,雖然代碼簡單,思路明了,但因為每次遞歸都需要進行一次sql查詢,效率上就不盡人意了,是以我會事先把所有的分類資料都查詢出來,然後存儲在一個數組中,建構樹形數組結構,然後按層級顯示,雖然代碼繁瑣,但查詢效率上得到優化。下面是我在開發過程中使用的這種無限分類方式。

應用場景

 在添加文章、商品過程中,需要将文章、商品分類有層次地展示。前台二、三級分類展示。

添加商品時的分類展示

 分類表結構

無限級分類總結(二)

 代碼

<?php
 
$link = mysqli_connect("localhost", "root", "root", "yiishop");
 
//擷取所有資料,存儲到一個數組中
function getAllCates($link)
{
    $data = [];
    $rows = mysqli_query($link, "select * from shop_category");
    while ($row = mysqli_fetch_array($rows)) {
        $data[] = $row;
    }
    return $data;
}
 
//對擷取的資料按照樹形進行排序
function getCates($cates, $pid = 0)
{
    $result = [];
    foreach ($cates as $cate) {
        if ($cate['parentid'] == $pid) {
            $result[] = $cate;
            $result = array_merge($result, getCates($cates, $cate['cateid']));
        } 
    }
    return $result;
}
 
//使用字首顯示層級
function setPrefix($data, $prefix="|-") 
{
    $n = 1;
    $path = [0=>1];
    $tree = []; //一個帶字首的樹,key為父id,值為層級
    while ($current = current($data)) {
        $key = key($data);
        if ($key > 0) {
            if ($data[$key-1]['parentid'] != $current['parentid']) {
                $n++;
            }
        }
        if (array_key_exists($current['parentid'], $path)) {
            $n = $path[$current['parentid']];
        } else {
            $path[$current['parentid']] = $n;
        }
 
        $current['title'] = str_repeat($prefix, $n).$current['title'];
        $tree[] = $current;
        next($data);
    }
    return $tree;
}
 
//對格式進行修改,鍵為id,值為title
function getList($link)
{
    $data = getAllCates($link);
    $data = getCates($data);
    $cates = setPrefix($data);
    $result = [];
    foreach ($cates as $cate) {
        $result[$cate['cateid']] = $cate['title'];
    }
    var_dump($result);
}
getList($link);

           

 效果顯示

無限級分類總結(二)

分類的前台展示

 如何在前台展示分類呢?譬如:類似淘寶,京東的分類導航。實作思路是:将擷取的分類資料拼湊成多元數組,然後通過循環周遊數組,可獲得多級分類的前台展示。

無限級分類總結(二)

 代碼

//将擷取的分類資料拼湊成二維數組,循環周遊數組,可擷取二級分類。
function showCates($link)
{
    $data = [];
    //擷取所有的頂級分類
    $rows = mysqli_query($link, "select * from shop_category where parentid=0");
    while ($row = mysqli_fetch_array($rows)) {
        //擷取所有的二級分類
        $rows2 = mysqli_query($link, "select * from shop_category where parentid=".$row['cateid']);
        while ($r = mysqli_fetch_array($rows2)) {
            $row['child'][] = $r;
        }
        $data['top'][] = $row;
    }
    //顯示所有分類
    var_dump($data);
}

showCates($link);

           

 注:三級分類也是同樣的做法,隻不過拼湊的是三維數組。

php