多層選單的迴圈遍歷

2021-06-22 20:47:01 字數 2425 閱讀 1748

在**別寫中經常會遇到多層選單的遍歷問題,如1級選單-》2級選單》3級選單.....

對此,我們最先想到的是用多層迴圈來解決問題。但是,如果確定只有2層選單還好,如果是3層就感覺**太過臃腫,如果是4層甚至多層....

然後,我們可以使用遞迴來解決這個問題。但是,這不是最好的方法!

因感覺遞迴方法還是太過繁瑣、比較閒的一直在思考如何更簡單的去實現。越想越頭疼,終於,在網上找到了大牛提供的方法,使用後只能用2個字形容,奇妙!

好吧  先來描述場景。

資料庫中有乙個選單表test,主要欄位為 id、parent_id、name, 當然還可以有is_leaf、level等等...

我們需要查詢出復合條件的所有條目 並以樹的形勢輸出。

開始編碼:

首先,我們遍歷test表,把樹中需要的條目遍歷出來。(為什麼不定條件查詢? 因為那樣需要迴圈查表,而直接全部遍歷只需一遍)。

然後,我們得到乙個這樣的陣列

$test=array(

1 =>array('id'=> 1,'parent_id'=> 0,'name'=>'江西省'),

2 =>array('id'=> 2,'parent_id'=> 0,'name'=>'黑龍江省'),

3 =>array('id'=> 3,'parent_id'=> 1,'name'=>'南昌市'),

);

當然,如果資料表中資料刪除過,可能會出現這樣的情況。

$test=array(

1 =>array('id'=> 5,'parent_id'=> 0,'name'=>'江西省'),

2 =>array('id'=> 8,'parent_id'=> 0,'name'=>'黑龍江省'),

3 =>array('id'=> 9,'parent_id'=> 1,'name'=>'南昌市'),

);

下面,先看**。

因為方法中使用parent_id去查詢父親節點,而盡遍歷一次,所以使id與 鍵 名相符,才可達到效果。

而$tmp為臨時陣列,只為使把$test 陣列的 鍵 名與id相等,而foreach遍歷的時候使用兩者無區別。

function gentree($test)

foreach ($test as $vo)

else

} unset($tmp);

return $tree;

}

該方法,沒有使用遞迴,也沒有多層迴圈,僅僅是一次迴圈使用父親兒子節點及完成目的。可惜,這不是我寫出來的。。。

不過,看到這樣的**,真的讓人激動。懷著感恩的心情,希望讓更多人看到。

另,**可以壓縮,只不過本人喜歡簡潔的演算法,不喜歡太過簡介的**。

element多層導航選單

很久沒寫部落格了原因就是懶,剛下班今天寫了個基於element導航選單實現多層選單 可以無限多層 元件核心思想就是元件遞迴 這個有時候面試會問到 可以看看這篇我寫的簡單文章 vue元件遞迴 然後就判斷children有沒有內容,沒內容就是選擇項嘛,內容就是父選單 只提供最基礎實現功能各種 可以參考e...

遍歷多層dict

初始dict dict ios end btn ios 遍歷這樣的dict,使用dict.items 或list dict.items 得到元組陣列,即陣列裡面的元素是元組 a,b start btn ios end btn ios 遍歷時,依次取元組,元組的第乙個元素是key,第二個元素是valu...

退出多層迴圈

方法一 正常情況下不報錯,三層迴圈,會執行5的三次方 raise 丟擲異常物件 固定用法 try中丟擲乙個異常,try裡所有的 都不會被執行。class getoutofloop exception pass try for i in range 5 for j in range 5 for k i...