PHP無限極分類函數(shù)的實(shí)現(xiàn)方法詳解
本文實(shí)例講述了PHP無限極分類函數(shù)的實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
在開發(fā)程序的時(shí)候,有時(shí)候,我們需要獲取所有欄目(包括一級(jí)欄目、二級(jí)欄目、三級(jí)欄目等等),并按照父子關(guān)系形成樹型結(jié)構(gòu)??梢圆扇∈褂眠f歸或者通過引用方式(php中引用類似C或者C++中的指針,只不過換一種說法而已)。
通過引用方式實(shí)現(xiàn)無限極分類
思路:
1.即所有待處理的數(shù)據(jù)進(jìn)行包裝成下標(biāo)為主鍵id(pk)的數(shù)組,便于有pid獲取對(duì)應(yīng)的父欄目。
2.對(duì)包裝的數(shù)據(jù)進(jìn)行循環(huán),如果為根節(jié)點(diǎn),則將其引用添加到tree中,否則,將其引用添加到其父類的子元素中。這樣雖然tree中,只是添加了根節(jié)點(diǎn),但是每個(gè)根節(jié)點(diǎ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)如下:

執(zhí)行結(jié)果如下
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] => 首頁
[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中無限極分類函數(shù)
/**
* 把返回的數(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;
}
通過遞歸方式實(shí)現(xiàn)無限極分類
思路:
1.使用循環(huán),分別獲取所有的根節(jié)點(diǎn)。
2.在獲取每個(gè)節(jié)點(diǎn)的時(shí)候,將該節(jié)點(diǎn)從原數(shù)據(jù)中移除,并遞歸方式獲取其所有的子節(jié)點(diǎn),一直原數(shù)據(jù)為空。
代碼實(shí)現(xià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;
}
效果截圖如下:

更多關(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常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP獲取指定時(shí)間段之間的 年,月,天,時(shí),分,秒
前端傳倆個(gè)標(biāo)準(zhǔn)的 時(shí)間格式過來,格式像2009-05-12 12:12:30,然后根據(jù)需要返回這個(gè)時(shí)間段的不同單位的表示,對(duì)于時(shí)間格式的校驗(yàn)我這里代碼沒貼出來,所以用的時(shí)候自己考慮加上2016-06-06
PHP正則表達(dá)式匹配替換與分割功能實(shí)例淺析
這篇文章主要介紹了PHP正則表達(dá)式匹配替換與分割功能,簡(jiǎn)單分析了php正則匹配、替換與分割相關(guān)函數(shù),并結(jié)合實(shí)例形式演示了php正則匹配的相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
PHP實(shí)現(xiàn)Redis分布式鎖的示例代碼
并發(fā)寫入問題可能導(dǎo)致數(shù)據(jù)不一致或重復(fù)寫入,為了解決這個(gè)問題,我們可以使用Redis實(shí)現(xiàn)分布式鎖,本文主要為大家介紹了PHP實(shí)現(xiàn)Redis分布式鎖的相關(guān)知識(shí),希望對(duì)大家有所幫助2023-12-12
PHP實(shí)現(xiàn)通過CURL上傳文件功能示例
這篇文章主要介紹了PHP實(shí)現(xiàn)通過CURL上傳文件功能,結(jié)合實(shí)例形式分析了php使用curl文件上傳操作相關(guān)屬性設(shè)置與使用技巧,需要的朋友可以參考下2018-05-05
PHP排序算法之希爾排序(Shell Sort)實(shí)例分析
這篇文章主要介紹了PHP排序算法之希爾排序(Shell Sort),結(jié)合實(shí)例形式較為詳細(xì)的分析了希爾排序的原理、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-04-04

