日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

迭代与递归实现无限级分类

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迭代与递归实现无限级分类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

無限級分類是開發中常見的情況了,在這里我收藏了下并整理了下常見的無限極分類算法總結歸納.

<?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'=>'廚房衛浴','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] => 廚房衛浴[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))))))

分析:

這個算法利用了循環迭代,將線性結構按照父子關系以樹形結構輸出,算法的關鍵在于使用了引用.

優點:速度快,效率高.

缺點:數組的key值必須與id值相同,不便于取出數據(使用遞歸獲取數據)

我們再看下遞歸的實現:

<?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'=>'廚房衛浴','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>'; } ?>

輸出:

家居 └―生活日用 └―└―收納用品 └―家庭裝修 └―廚房衛浴 服裝 └―男裝 └―└―牛仔褲 └―女裝 護膚品 └―面部護膚 └―└―補水保濕

分析:

利用了遞歸,數組的key值與id值可以不相同,最后以順序的結構輸出數組

優點:方便遍歷,查找父子元素

缺點:php不擅長遞歸,數據量大的情況下效率會顯著降低
總結:兩種方法各有利弊,后者不適合大數據下使用,前者推薦吧

總結

以上是生活随笔為你收集整理的迭代与递归实现无限级分类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。