在php中無限分類是我們在實際開發中經常用到的一種數據結構,一般我們稱之為樹形結構,像我網站的分類有php入門,正則等等分類,這種是二級不是無限級了,如果是無限級就可以在子類下加子類了.
我們先來看我實現無限分類的具體過程.
題設:類似淘寶的商品分類,可以在任意分類設置其子類.
一、創建`type`數據表,代碼如下:
- `id` 自增長
- `fid` int(11) 默認(0) ,父節點id
- `name` varchar(50),分類名稱
- CREATE TABLE `type` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `fid` int(11) NOT NULL DEFAULT '0',
- `name` varchar(50) NOT NULL,
- PRIMARY KEY (`id`)
- )
二、添加,我們先添加幾個頂級分類,代碼如下:
- INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '手機');
- INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '電腦');
- INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '鞋子');
- INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '衣服');這里fid=0是代表頂級分類
接著我們為{電腦}添加幾個個子分類,代碼如下:
這里fid=2,2這個id是分類{電腦}的id,如果是添加{鞋子}的子分類則fid=3,同理我們為{筆記本}添加子分類則fid=6,代碼如下:
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '6', 'ausu'), (NULL, '6', 'hp');
三、刪除,如果我們想刪除{筆記本}這個分類,很簡單:
DELETE FROM `type` WHERE `id`=6{筆記本}的子分類我們也要記得做相應的處理
代碼如下:
- function del($fid) {
- $sql="SELECT * FROM `type` WHERE `fid`=$fid";
- $rs=mysql_query($sql);
- for ($i = 0; $i < count($rs); $i++) {
- $sql="DELETE FROM `type` WHERE `id`={$rs[$i]['id']}";
- mysql_query($sql);
- del($rs['id']);//遞歸
- }
- }
- del(6);//執行操作這里你也許你會疑惑為什么那么麻煩用遞歸,而不是直接這樣刪除
DELETE FROM `type` WHERE `fid`=6這樣我們不就可以直接刪除{ausu}、{hp}?但是假設{ausu}有一個子分類{a1},{a1}也有一個子分類{a2},如果不用遞歸我們就無法徹底刪除數據.
四、查找
1.查找{電腦}的子分類
SELECT * FROM `type` WHERE `fid`=22.查找{電腦}的所有子分類
代碼如下:
- function sel($fid) {
- $sql="SELECT * FROM `type` WHERE `fid`=$fid";
- $rs=mysql_query($sql);
- for ($i = 0; $i < count($rs); $i++) {
- echo $rs[$i]['name'];
- sel($rs[$i]['id']);//遞歸
- }
- }
- sel(2);
五、實際數據應用
在數據表添加一個字段`tid`,字段值為記錄所屬分類`type`表的id,必須是id不能是name,因為name的值可能會改變.
例如查詢屬于{電腦}分類的商品,代碼如下:
SELECT * FROM `goods` WHERE `tid`=2
下面再看個實例,直接操作數組,代碼如下:
- <?php
- $rows = array(
- array(
- 'id' => 1,
- 'name' => 'dev',
- 'parentid' => 0
- ),
- array(
- 'id' => 2,
- 'name' => 'php',
- 'parentid' => 1
- ),
- array(
- 'id' => 3,
- 'name' => 'smarty',
- 'parentid' => 2
- ),
- array(
- 'id' => 4,
- 'name' => 'life',
- 'parentid' => 0
- ),
- array(
- 'id' => 5,
- 'name' => 'pdo',
- 'parentid' => 2
- ),
- array(
- 'id' => 6,
- 'name' => 'pdo-mysql',
- 'parentid' => 5
- ),
- array(
- 'id' => 7,
- 'name' => 'java',
- 'parentid' => 1
- )
- );
- // 72648
- // 84072
- function findChild(&$arr,$id){
- $childs=array();
- foreach ($arr as $k => $v){
- if($v['parentid']== $id){
- $childs[]=$v;
- }
- }
- return $childs;
- }
- function build_tree($root_id){
- global $rows;
- $childs=findChild($rows,$root_id);
- if(emptyempty($childs)){
- return null;
- }
- foreach ($childs as $k => $v){
- $rescurTree=build_tree($v[id]);
- if( null != $rescurTree){
- $childs[$k]['childs']=$rescurTree;
- }
- }
- return $childs;
- }
- $tree=build_tree(0);
- echo memory_get_usage();
- print_r($tree);
- ?>
我自己用的可以做那種下拉效果并帶有級數的效果,代碼如下:
- function dafenglei_select($m,$id, $fenlei ){
- global $menu;
- $n = str_pad('',$m,'-',STR_PAD_RIGHT);
- $n = str_replace("-"," ",$n);
- for($i=0;$i<count($fenlei);$i++){
- if($fenlei[$i]['classid']==$id){
- $menu .= "<option value="".$fenlei[$i]['id']."">".$n."|—".$fenlei[$i]['name']."</option>n";
- }
- $this->dafenglei_select($m+1,$fenlei[$i]['id'], $fenlei );
- }
- }
- return $menu;
- }
- dafenglei_select(0,0, $fenlei );
$fenlei 無限分類數組 $id是選擇從哪個分類開始寫0代表頂級開始分,只要把數組放進去就可以分了.
新聞熱點
疑難解答