php 取多级分类,php – 获取所有类别(多级)
解決問(wèn)題的最簡(jiǎn)單方法是添加遞歸.
public function getCategoryTreeForParentId($parent_id = 0) {
$categories = array();
$this->db->from('categories');
$this->db->where('parent_id', $parent_id);
$result = $this->db->get()->result();
foreach ($result as $mainCategory) {
$category = array();
$category['id'] = $mainCategory->id;
$category['name'] = $mainCategory->name;
$category['parent_id'] = $mainCategory->parent_id;
$category['sub_categories'] = $this->getCategoryTreeForParentId($category['id']);
$categories[$mainCategory->id] = $category;
}
return $categories;
}
通過(guò)預(yù)加載所有類(lèi)別并在陣列上操作,可以大大提高此方法,從而跳過(guò)每個(gè)新parent_id的查詢(xún).
我也沒(méi)有使用codeigniter的對(duì)象,因?yàn)槲也恢浪鼈?如果它們支持魔術(shù)setter / getter或者可以說(shuō)服它們獲取一系列子對(duì)象,那么應(yīng)該使用它們來(lái)代替我在這里構(gòu)建的數(shù)組.
算法的作用是:使用給定的parent_id加載所有類(lèi)別,遍歷所有這些類(lèi)別,將iteration-category-id假設(shè)為parent_id并為其加載所有內(nèi)容.
這有效地加載所有類(lèi)別,只要它們引用現(xiàn)有類(lèi)別.
涉及到一個(gè)輕微的危險(xiǎn):當(dāng)您構(gòu)建類(lèi)別A和B時(shí),其中A將B作為父級(jí),B將A作為父級(jí),您將遇到無(wú)限循環(huán),因?yàn)樗鼈儠?huì)一次又一次地相互加載.這會(huì)強(qiáng)制您在數(shù)據(jù)中使用干凈的樹(shù)結(jié)構(gòu).
更新
因?yàn)檫@仍然得到了回報(bào):
有關(guān)此實(shí)施的另一個(gè)建議.
如果您的類(lèi)別樹(shù)更大或具有多個(gè)級(jí)別,則可能會(huì)遇到性能問(wèn)題,因?yàn)榇藢?shí)現(xiàn)會(huì)使用新的查詢(xún)參數(shù)一次又一次地加載類(lèi)別.這很容易導(dǎo)致數(shù)十,數(shù)百或數(shù)千個(gè)查詢(xún),具體取決于您的類(lèi)別樹(shù).
一種更有效的方法是從類(lèi)別表中加載所有類(lèi)別(使用一個(gè)查詢(xún)),并在應(yīng)用程序中使用遞歸對(duì)它們進(jìn)行排序.這是極少數(shù)情況之一,早期評(píng)估確實(shí)可以提高性能.
如果在同一個(gè)請(qǐng)求中需要多次樹(shù),那么甚至可以通過(guò)靜態(tài)變量添加緩存(具有緩存的所有常見(jiàn)危險(xiǎn)).
總結(jié)
以上是生活随笔為你收集整理的php 取多级分类,php – 获取所有类别(多级)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php获取函数里参数吗,php函数中获取
- 下一篇: php图片去噪,python 图片去噪的