前言
前面,我已經寫過一篇關于無限極分類的文章《無限級分類總結》。但在實際開發中,我可能不會選擇那兩種實作方法,而是選擇另外一種更好的實作思路。前面那一種,在一個函數中通過遞歸實作所有分類的查詢,雖然代碼簡單,思路明了,但因為每次遞歸都需要進行一次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);
注:三級分類也是同樣的做法,隻不過拼湊的是三維數組。