《PHP學(xué)習(xí):PHP無(wú)限極分類函數(shù)的實(shí)現(xiàn)方法詳解》要點(diǎn):
本文介紹了PHP學(xué)習(xí):PHP無(wú)限極分類函數(shù)的實(shí)現(xiàn)方法詳解,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
本文實(shí)例講述了PHP無(wú)限極分類函數(shù)的實(shí)現(xiàn)方法.分享給大家供大家參考,具體如下:PHP實(shí)戰(zhàn)
在開(kāi)發(fā)程序的時(shí)候,有時(shí)候,我們需要獲取所有欄目(包括一級(jí)欄目、二級(jí)欄目、三級(jí)欄目等等),并按照父子關(guān)系形成樹(shù)型結(jié)構(gòu).可以采取使用遞歸或者通過(guò)引用方式(php中引用類似C或者C++中的指針,只不過(guò)換一種說(shuō)法而已).PHP實(shí)戰(zhàn)
通過(guò)引用方式實(shí)現(xiàn)無(wú)限極分類PHP實(shí)戰(zhàn)
思路:PHP實(shí)戰(zhàn)
1.即所有待處理的數(shù)據(jù)進(jìn)行包裝成下標(biāo)為主鍵id(pk)的數(shù)組,便于有pid獲取對(duì)應(yīng)的父欄目.PHP實(shí)戰(zhàn)
2.對(duì)包裝的數(shù)據(jù)進(jìn)行循環(huán),如果為根節(jié)點(diǎn),則將其引用添加到tree中,否則,將其引用添加到其父類的子元素中.這樣雖然tree中,只是添加了根節(jié)點(diǎn),但是每個(gè)根節(jié)點(diǎn)如果有子元素,其中包含了子元素的引用.故能形成樹(shù)型.PHP實(shí)戰(zhàn)
代碼如下PHP實(shí)戰(zhàn)
/** * 把返回的數(shù)據(jù)集轉(zhuǎn)換成Tree * @param array $list 要轉(zhuǎn)換的數(shù)據(jù)集 * @param string $pk 自增字段(欄目id) * @param string $pid parent標(biāo)記字段 * @return array * @author dqs <1696232133@qq.com> */ function make_tree($list,$pk='id',$pid='pid',$child='_child',$root=0){ $tree=array(); $packData=array(); foreach ($list as $data) { $packData[$data[$pk]] = $data; } foreach ($packData as $key =>$val){ if($val[$pid]==$root){//代表跟節(jié)點(diǎn) $tree[]=& $packData[$key]; }else{ //找到其父類 $packData[$val[$pid]][$child][]=& $packData[$key]; } } return $tree; }
數(shù)據(jù)結(jié)構(gòu)如下:PHP實(shí)戰(zhàn)
PHP實(shí)戰(zhàn)
執(zhí)行結(jié)果如下PHP實(shí)戰(zhàn)
Array ( [0] => Array ( [id] => 6 [pid] => 0 [title] => 測(cè)試1 [url] => test1 [sort] => 0 [create_time] => 1464076199 [update_time] => 1464076199 [status] => 1 [target] => 0 ) [1] => Array ( [id] => 7 [pid] => 0 [title] => 測(cè)試2 [url] => test2 [sort] => 0 [create_time] => 1464076218 [update_time] => 1464076218 [status] => 1 [target] => 0 ) [2] => Array ( [id] => 1 [pid] => 0 [title] => 首頁(yè) [url] => Index/index [sort] => 1 [create_time] => 1379475111 [update_time] => 1379923177 [status] => 1 [target] => 0 ) [3] => Array ( [id] => 2 [pid] => 0 [title] => 博客 [url] => Article/index?category=blog [sort] => 2 [create_time] => 1379475131 [update_time] => 1379483713 [status] => 1 [target] => 0 [_child] => Array ( [0] => Array ( [id] => 4 [pid] => 2 [title] => 個(gè)人博客 [url] => ownblog [sort] => 0 [create_time] => 1464075558 [update_time] => 1464075558 [status] => 1 [target] => 0 [_child] => Array ( [0] => Array ( [id] => 8 [pid] => 4 [title] => 新浪博客 [url] => sinaBlog [sort] => 0 [create_time] => 1464077276 [update_time] => 1464077276 [status] => 1 [target] => 0 ) ) ) [1] => Array ( [id] => 5 [pid] => 2 [title] => 他人博客 [url] => otherBlog [sort] => 0 [create_time] => 1464075582 [update_time] => 1464075582 [status] => 1 [target] => 0 ) ) ) [4] => Array ( [id] => 3 [pid] => 0 [title] => 官網(wǎng) [url] => http://www.onethink.cn [sort] => 3 [create_time] => 1379475154 [update_time] => 1387163458 [status] => 1 [target] => 0 ) )
附加OneThink中無(wú)限極分類函數(shù)PHP實(shí)戰(zhàn)
/** * 把返回的數(shù)據(jù)集轉(zhuǎn)換成Tree * @param array $list 要轉(zhuǎn)換的數(shù)據(jù)集 * @param string $pid parent標(biāo)記字段 * @param string $level level標(biāo)記字段 * @return array * @author 麥當(dāng)苗兒 <zuojiazi@vip.qq.com> */ function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) { // 創(chuàng)建Tree $tree = array(); if(is_array($list)) { // 創(chuàng)建基于主鍵的數(shù)組引用 $refer = array(); foreach ($list as $key => $data) { $refer[$data[$pk]] =& $list[$key]; } foreach ($list as $key => $data) { // 判斷是否存在parent $parentId = $data[$pid]; if ($root == $parentId) { $tree[] =& $list[$key]; }else{ if (isset($refer[$parentId])) { $parent =& $refer[$parentId]; $parent[$child][] =& $list[$key]; } } } } return $tree; }
通過(guò)遞歸方式實(shí)現(xiàn)無(wú)限極分類PHP實(shí)戰(zhàn)
思路:PHP實(shí)戰(zhàn)
1.使用循環(huán),分別獲取所有的根節(jié)點(diǎn).PHP實(shí)戰(zhàn)
2.在獲取每個(gè)節(jié)點(diǎn)的時(shí)候,將該節(jié)點(diǎn)從原數(shù)據(jù)中移除,并遞歸方式獲取其所有的子節(jié)點(diǎn),一直原數(shù)據(jù)為空.PHP實(shí)戰(zhàn)
代碼實(shí)現(xiàn)如下:PHP實(shí)戰(zhàn)
function make_tree1($list,$pk='id',$pid='pid',$child='_child',$root=0){ $tree=array(); foreach($list as $key=> $val){ if($val[$pid]==$root){ //獲取當(dāng)前$pid所有子類 unset($list[$key]); if(! empty($list)){ $child=make_tree1($list,$pk,$pid,$child,$val[$pk]); if(!empty($child)){ $val['_child']=$child; } } $tree[]=$val; } } return $tree; }
效果截圖如下:PHP實(shí)戰(zhàn)
PHP實(shí)戰(zhàn)
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計(jì)算法總結(jié)》、《php排序算法總結(jié)》、《PHP常用遍歷算法與技巧總結(jié)》、《PHP數(shù)學(xué)運(yùn)算技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》PHP實(shí)戰(zhàn)
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助.PHP實(shí)戰(zhàn)
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/961.html