迭代与递归实现无限级分类
生活随笔
收集整理的這篇文章主要介紹了
迭代与递归实现无限级分类
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
無限級分類是開發(fā)中常見的情況了,在這里我收藏了下并整理了下常見的無限極分類算法總結(jié)歸納.
<?php $arr = [1=>['id'=>1,'name'=>'家居','father'=>NULL],2=>['id'=>2,'name'=>'服裝','father'=>NULL],3=>['id'=>3,'name'=>'護膚品','father'=>NULL],4=>['id'=>4,'name'=>'生活日用','father'=>1],5=>['id'=>5,'name'=>'家庭裝修','father'=>1],6=>['id'=>6,'name'=>'廚房衛(wèi)浴','father'=>1],7=>['id'=>7,'name'=>'男裝','father'=>2],8=>['id'=>8,'name'=>'女裝','father'=>2],9=>['id'=>9,'name'=>'面部護膚','father'=>3],10=>['id'=>10,'name'=>'補水保濕','father'=>9],11=>['id'=>11,'name'=>'收納用品','father'=>4],12=>['id'=>12,'name'=>'牛仔褲','father'=>7], ]; function generateTree($items){$tree = array();foreach($items as $item){if(isset($items[$item['father']])){$items[$item['father']]['son'][] = &$items[$item['id']];}else{$tree[] = &$items[$item['id']];}}return $tree; } $tree = generateTree($arr); print_r($tree); ?>輸出:
Array ([0] => Array([id] => 1[name] => 家居[father] => [son] => Array([0] => Array([id] => 4[name] => 生活日用[father] => 1[son] => Array([0] => Array([id] => 11[name] => 收納用品[father] => 4)))[1] => Array([id] => 5[name] => 家庭裝修[father] => 1)[2] => Array([id] => 6[name] => 廚房衛(wèi)浴[father] => 1)))[1] => Array([id] => 2[name] => 服裝[father] => [son] => Array([0] => Array([id] => 7[name] => 男裝[father] => 2[son] => Array([0] => Array([id] => 12[name] => 牛仔褲[father] => 7)))[1] => Array([id] => 8[name] => 女裝[father] => 2)))[2] => Array([id] => 3[name] => 護膚品[father] => [son] => Array([0] => Array([id] => 9[name] => 面部護膚[father] => 3[son] => Array([0] => Array([id] => 10[name] => 補水保濕[father] => 9))))))分析:
這個算法利用了循環(huán)迭代,將線性結(jié)構(gòu)按照父子關(guān)系以樹形結(jié)構(gòu)輸出,算法的關(guān)鍵在于使用了引用.
優(yōu)點:速度快,效率高.
缺點:數(shù)組的key值必須與id值相同,不便于取出數(shù)據(jù)(使用遞歸獲取數(shù)據(jù))
我們再看下遞歸的實現(xiàn):
<?php $arr = [1=>['id'=>1,'name'=>'家居','father'=>NULL],2=>['id'=>2,'name'=>'服裝','father'=>NULL],3=>['id'=>3,'name'=>'護膚品','father'=>NULL],4=>['id'=>4,'name'=>'生活日用','father'=>1],5=>['id'=>5,'name'=>'家庭裝修','father'=>1],6=>['id'=>6,'name'=>'廚房衛(wèi)浴','father'=>1],7=>['id'=>7,'name'=>'男裝','father'=>2],8=>['id'=>8,'name'=>'女裝','father'=>2],9=>['id'=>9,'name'=>'面部護膚','father'=>3],10=>['id'=>10,'name'=>'補水保濕','father'=>9],11=>['id'=>11,'name'=>'收納用品','father'=>4],12=>['id'=>12,'name'=>'牛仔褲','father'=>7], ]; function generateTree($arr,$id,$step){static $tree=[];foreach($arr as $key=>$val) {if($val['father'] == $id) {$flag = str_repeat('└―',$step);$val['name'] = $flag.$val['name'];$tree[] = $val;generateTree($arr , $val['id'] ,$step+1);}}return $tree; } $tree = generateTree($arr,0,0); foreach ($tree as $val){echo $val['name'].'<br>'; } ?>輸出:
家居 └―生活日用 └―└―收納用品 └―家庭裝修 └―廚房衛(wèi)浴 服裝 └―男裝 └―└―牛仔褲 └―女裝 護膚品 └―面部護膚 └―└―補水保濕分析:
利用了遞歸,數(shù)組的key值與id值可以不相同,最后以順序的結(jié)構(gòu)輸出數(shù)組
優(yōu)點:方便遍歷,查找父子元素
缺點:php不擅長遞歸,數(shù)據(jù)量大的情況下效率會顯著降低
總結(jié):兩種方法各有利弊,后者不適合大數(shù)據(jù)下使用,前者推薦吧
總結(jié)
以上是生活随笔為你收集整理的迭代与递归实现无限级分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#多线程编程(转)
- 下一篇: 三年从前端小工到架构-知乎 Live 学