本篇文章主要介紹PHP遞歸算法詳解,感興趣的朋友參考下,希望對大家有所幫助。
遇到需要設(shè)計樹節(jié)點的數(shù)據(jù)庫結(jié)構(gòu),以及需要讀出來的樹節(jié)點數(shù)據(jù)結(jié)構(gòu)!大家是否會選擇用數(shù)據(jù)庫的查詢方式來獲取樹結(jié)構(gòu)呢?
//曾經(jīng)的數(shù)據(jù)庫查詢獲取方式$res = $this->db->query("select * from menu where pid = 0");foreach($res as $k=>$v){ $res[$k]['child'] = $this->db->query("select * from menu where pid =".$v['id']);}
//獲得結(jié)果 $res;
注意:不得不說,這種方式的確可行,但是它的缺點在于,你需要固定多少層級,以及數(shù)據(jù)庫的大量運行查詢。
不要忽視了那點數(shù)據(jù)庫的查詢消耗哦,數(shù)據(jù)小還無所謂,但是數(shù)據(jù)量大了。這種可行的方式,會給系統(tǒng)帶來很大的負擔!
那么,大家要明白一個道理,有些時候 數(shù)據(jù)庫的操作 利大于 PHP程序算法,有些時候則反之!
在這種基礎(chǔ)的樹節(jié)點情況下,用算法是最佳的。
PHP 代碼算法(CI框架實現(xiàn):并非打廣告!)
html' target='_blank'>public function getMenus(){ //查詢 $res = $this->db->get('menu')->result_array(); $res = $this->getChild($res); print_r($res);}/** * 遞歸 樹節(jié)點算法 * @param array $array * @param number $pid */private function getChild($array,$pid = 0){ $data = array(); foreach ($array as $k=>$v){ //PID符合條件的 if($v['pid'] == $pid){ //尋找子集 $child = $this->getChild($array,$v['id']); //加入數(shù)組 $v['child'] = $child?:array(); $data[] = $v;//加入數(shù)組中 } } return $data;}
//這樣的好處在于,運算速度快,消耗小,而且不定層級。意味著,數(shù)據(jù)庫寫多少層級,該算法,都可以獲取出來
結(jié)果:
Array([0] => Array ( [id] => 1 [title] => PHP [pid] => 0 [sort] => 0 [child] => Array ( ))[1] => Array ( [id] => 2 [title] => 系統(tǒng)設(shè)置 [pid] => 0 [sort] => 99 [child] => Array ( [0] => Array ( [id] => 4 [title] => 權(quán)限管理 [pid] => 2 [sort] => 2 [child] => Array ( ) ) [1] => Array ( [id] => 5 [title] => 菜單欄目 [pid] => 2 [sort] => 0 [child] => Array ( ) ) [2] => Array ( [id] => 3 [title] => 管理員 [pid] => 2 [sort] => 99 [child] => Array ( ) ) ) ))
相關(guān)推薦:
Python基于遞歸算法實現(xiàn)的漢諾塔與Fibonacci數(shù)列
PHP漢諾塔問題的遞歸算法的實現(xiàn)和迭代算法的實現(xiàn)
PHP漢諾塔問題的遞歸算法實現(xiàn)和迭代算法實現(xiàn)
以上就是PHP遞歸算法詳解的詳細內(nèi)容,更多請關(guān)注 其它相關(guān)文章!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
|
新聞熱點
疑難解答