php無限分類根據頂類獲取所有子類
阿新 • • 發佈:2018-12-17
首先建立分類資訊表:
CREATE TABLE IF NOT EXISTS `category` (
`categoryId` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`parentId` smallint(5) unsigned NOT NULL DEFAULT '0',
`categoryName` varchar(50) NOT NULL,
PRIMARY KEY (`categoryId`)
) ;
插入若干資料:
CREATE TABLE IF NOT EXISTS `category` ( `categoryId` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `parentId` smallint(5) unsigned NOT NULL DEFAULT '0', `categoryName` varchar(50) NOT NULL, PRIMARY KEY (`categoryId`) ) ; INSERT INTO `category` (`categoryId`, `parentId`, `categoryName`) VALUES (1, 0, 'php'), (2, 0, 'java'), (3, 0, 'c/c++'), (4, 1, 'php基礎'), (5, 1, 'php開源資料'), (6, 1, 'php框架'), (7, 2, 'java Se'), (8, 2, 'java EE'), (9, 2, 'java Me'), (10, 3, 'c/c++基礎程式設計'), (11, 3, 'c/c++系統開發'), (12, 3, 'c嵌入式程式設計'), (13, 3, 'c++應用開發'), (14, 13, 'c++桌面應用開發'), (15, 13, 'c++遊戲開發');
下面是php程式碼:
*/ //獲取某分類的直接子分類 function getSons($categorys,$catId=0){ $sons=array(); foreach($categorys as $item){ if($item['parentId']==$catId) $sons[]=$item; } return $sons; } //獲取某個分類的所有子分類 function getSubs($categorys,$catId=0,$level=1){ $subs=array(); foreach($categorys as $item){ if($item['parentId']==$catId){ $item['level']=$level; $subs[]=$item; $subs=array_merge($subs,getSubs($categorys,$item['categoryId'],$level+1)); } } return $subs; } //獲取某個分類的所有父分類 //方法一,遞迴 function getParents($categorys,$catId){ $tree=array(); foreach($categorys as $item){ if($item['categoryId']==$catId){ if($item['parentId']>0) $tree=array_merge($tree,getParents($categorys,$item['parentId'])); $tree[]=$item; break; } } return $tree; } //方法二,迭代 function getParents2($categorys,$catId){ $tree=array(); while($catId != 0){ foreach($categorys as $item){ if($item['categoryId']==$catId){ $tree[]=$item; $catId=$item['parentId']; break; } } } return $tree; } //測試 部分 $pdo=new PDO('mysql:host=localhost;dbname=test','root','8888'); $stmt=$pdo->query("select * from category order by categoryId"); $categorys=$stmt->fetchAll(PDO::FETCH_ASSOC); $result=getSons($categorys,1); foreach($result as $item) echo $item['categoryName'].'<br>'; echo '<hr>'; $result=getSubs($categorys,0); foreach($result as $item) echo str_repeat(' ',$item['level']).$item['categoryName'].'<br>'; echo '<hr>'; $result=getParents($categorys,7); foreach($result as $item) echo $item['categoryName'].' >> '; echo '<hr>'; $result=getParents2($categorys,15); foreach($result as $item) echo $item['categoryName'].' >> '; ?>
$category_list = array( array('id'=>1, 'name'=>'1級分類 1', 'pid'=>0), array('id'=>2, 'name'=>'1級分類 2', 'pid'=>0), array('id'=>3, 'name'=>'1級分類 3', 'pid'=>0), array('id'=>4, 'name'=>'2級分類 1', 'pid'=>1), array('id'=>5, 'name'=>'2級分類 2', 'pid'=>2), array('id'=>6, 'name'=>'3級分類 1', 'pid'=>4), array('id'=>7, 'name'=>'3級分類 2', 'pid'=>5), array('id'=>8, 'name'=>'4級分類 1', 'pid'=>6), array('id'=>9, 'name'=>'3級分類 2', 'pid'=>5), ); $son_list = getSubs($category_list, 2); function getSubs($categorys,$catId=0,$level=1){ $subs=array(); foreach($categorys as $item){ if($item['pid']==$catId){ $item['level']=$level; $subs[]=$item; $subs=array_merge($subs,getSubs($categorys,$item['id'],$level+1)); } } /* print_r結果:先進後出(2-》5-》7、9) array_merge(array(5), array(7,9)) 4 getSubs()得到array(7,9) 3 array_merge(array(7), array()) 1 array_merge(array(7,9), array()) 2 */ print_r($subs); return $subs; }
例子:
$category_list = array(
array('id'=>1, 'name'=>'1級分類 1', 'pid'=>0),
array('id'=>2, 'name'=>'1級分類 2', 'pid'=>0),
array('id'=>3, 'name'=>'1級分類 3', 'pid'=>0),
array('id'=>4, 'name'=>'2級分類 1', 'pid'=>1),
array('id'=>5, 'name'=>'2級分類 2', 'pid'=>2),
array('id'=>6, 'name'=>'3級分類 1', 'pid'=>4),
array('id'=>7, 'name'=>'3級分類 2', 'pid'=>5),
array('id'=>8, 'name'=>'4級分類 1', 'pid'=>6),
array('id'=>9, 'name'=>'3級分類 2', 'pid'=>5),
);
$a = getSonx(1, $category_list);
//print_r($a);exit;
function getSonx($id, $data){
$returnData = array();
foreach($data as $k=>$v){
if($v['pid'] == $id){
$returnData[] = $v;
$a = getSonx($v['id'], $data);
if($a){
print_r($a);
$returnData = array_merge($returnData, $a);
}
//從最底層資料,向上合併。
//for pid=5層,id:7,9是最底層了,getSonx()返回的是2個空array因為(沒有子類)
//結果:$returnData = array(7,9); 即$returnData[];
//for pid=2層,id:5 合併剛才的7,9 $returnData = array(7,9);
//結果:$returnData = array(5,7,9);
}
}
return $returnData;
}
exit;
下面是執行的結果: