当前位置: 澳门新濠3559 > 编程 > 正文

我们先来看我实现无限分类的具体过程,id 菜单

时间:2019-11-22 20:51来源:编程
# -------------------------------------------------------- #数据表的结构 'menu' #--------------------------------------------------------CREATE TABLEmenu NOT NULL auto_increment, menu varchar NOT NULL, menu_grade intNOT NULL, menu_sup

# -------------------------------------------------------- # 数据表的结构 'menu' # --------------------------------------------------------CREATE TABLE menu NOT NULL auto_increment, menu varchar NOT NULL, menu_grade int NOT NULL, menu_superior int NOT NULL, UNIQUE menu_id ; # -------------------------------------------------#数据表内的内容,根据具体情况而定# -------------------------------------------------INSERT INTO menu VALUES( '1', '计算机', '1', '0'); INSERT INTO menu VALUES; INSERT INTO menu VALUES; INSERT INTO menu VALUES( '4', 'PHP与MySql', '3', '2'); INSERT INTO menu VALUES( '5', 'C语言', '3', '2'); INSERT INTO menu VALUES( '6', '网页制作', '3', '3'); INSERT INTO menu VALUES( '7', 'TCP、IP协议', '3', '3'); INSERT INTO menu VALUES; INSERT INTO menu VALUES( '9', '高等数学', '2', '8'); INSERT INTO menu VALUES( '10', '线性代数', '3', '9'); INSERT INTO menu VALUES( '11', '离散数学', '3', '9'); INSERT INTO menu VALUES( '12', '初等数学', '2', '8'); INSERT INTO menu VALUES( '13', '文学', '1', '0'); INSERT INTO menu VALUES( '14', '中国文学', '2', '13'); INSERT INTO menu VALUES( '15', 'php', '4', '4'); INSERT INTO menu VALUES( '16', 'mysql', '4', '4'); //树型目录结构模板程序 //菜单目录库字段说明: //menu_id 菜单项目 id //menu 菜单名称 //menu_grade 菜单等级 1 为主菜单 2 为二级菜单 ........ //menu_superior 上一级菜单 id 号 function my_menu($menu_content,$i,$menu_grade_temp,$menu_superior_temp) { global $PHP_SELF; $temp1=$menu_grade_temp+1; $menu_superior_temp_array=split("/",$menu_superior_temp); for { $menu_array=split("/",$menu_content[$t]); If(($menu_array[2]==$menu_grade_temp)&&($menu_array[3]==$menu_superior_temp_array[$menu_grade_temp-1])) { for($p=1;$p<=$menu_grade_temp;$p++){echo ">";} //显示目录前的等级箭头$temp3=$menu_superior_temp_array; $temp3[$menu_grade_temp]=$menu_澳门新濠3559,array[0]; $temp2=implode; if ($menu_array[0]==$menu_superior_temp_array[$temp1-1]) { $temp5=$temp1-1; $temp3[$menu_grade_temp]=""; $temp6=implode; echo "$menu_array[1]
";my_menu($menu_content,$i,$temp1,$temp2); } else { $temp3[$menu_grade_temp+1]=""; $temp6=implode; echo "$menu_array[1]
";} } } } // 连接 MySql 数据库 $db_host="localhost"; $db_user="root"; $db_password="zmxj"; $db_name="joss"; mysql_connect($db_host,$db_user,$db_password); mysql_select_db; //从数据库中取得数据 $query_string="select * from menu order by menu_grade"; $db_data=mysql_query; //第一次执行初始化 if ($menu_grade_temp=="") { $menu_superior_temp=0; } //将所有的信息读入数组,并统计数组个数 $i=0; while (list($menu_id,$menu,$menu_grade,$menu_superior)=mysql_fetch_row { $menu_content[$i]=$menu_id."/".$menu."/".$menu_grade."/".$menu_superior; $i++; } my_menu($menu_content,$i,1,$menu_superior_temp); ?>

//树型目录结构模板程序//菜单目录库字段说明://menu_id 菜单项目 id//menu 菜单名称//menu_grade 菜单等级 1 为主菜单 2 为二级菜单 ........//menu_superior 上一级菜单 id 号function my_menu($menu_content,$i,$menu_grade_temp,$menu_superior_temp){global $PHP_SELF;$temp1=$menu_grade_temp+1;$menu_superior_temp_array=split("/",$menu_superior_temp);for {$menu_我们先来看我实现无限分类的具体过程,id 菜单项目 id//menu。array=split("/",$menu_content[$t]);If(($menu_array[2]==$menu_grade_temp)&&($menu_array[3]==$menu_superior_temp_array[$menu_grade_temp-1])){for($p=1;$p<=$menu_grade_temp;$p++){echo "";}$temp3=$menu_superior_temp_array;$temp3[$menu_grade_temp]=$menu_array[0];$temp2=implode;if ($menu_array[0]==$menu_superior_temp_array[$temp1-1]){$temp5=$temp1-1;$temp3[$menu_grade_temp]="";$temp6=implode;echo "$menu_array[1]
";my_menu($menu_content,$i,$temp1,$temp2);}else{$temp3[$menu_grade_temp+1]="";$temp6=implode;echo "$menu_array[1]
";}}}}// 连接 MySql 数据库$db_host="localhost";$db_user="dkj";$db_password="123";$db_name="test";mysql_connect($db_host,$db_user,$db_password);mysql_select_db;//从数据库中取得数据$query_string="select * from menu order by menu_grade";$db_data=mysql_query;//第一次执行初始化if ($menu_grade_temp==""){$menu_superior_temp=0;}//将所有的信息读入数组,并统计数组个数$i=0;while (list($menu_id,$menu,$menu_grade,$menu_superior)=mysql_fetch_row{$menu_content[$i]=$menu_id."/".$menu."/".$menu_grade."/".$menu_superior;$i++;}my_menu($menu_content,$i,1,$menu_superior_temp);/* 附数据库结构及模拟数据# phpMyAdmin MySQL-Dump## 主机: localhost 数据库 : test# --------------------------------------------------------## 数据表的结构 'menu'#CREATE TABLE menu NOT NULL auto_increment,menu varchar NOT NULL,menu_grade int NOT NULL,menu_superior int NOT NULL,UNIQUE menu_id ;## 导出下面的数据库内容 'menu'#INSERT INTO menu VALUES( '1', '计算机', '1', '0');INSERT INTO menu VALUES;INSERT INTO menu VALUES;INSERT INTO menu VALUES( '4', 'PHP与MySql', '3', '2');INSERT INTO menu VALUES( '5', 'C语言', '3', '2');INSERT INTO menu VALUES( '6', '网页制作', '3', '3');INSERT INTO menu VALUES( '7', 'TCP、IP协议', '3', '3');INSERT INTO menu VALUES;INSERT INTO menu VALUES( '9', '高等数学', '2', '8');INSERT INTO menu VALUES( '10', '线性代数', '3', '9');INSERT INTO menu VALUES( '11', '离散数学', '3', '9');INSERT INTO menu VALUES( '12', '初等数学', '2', '8');INSERT INTO menu VALUES( '13', '文学', '1', '0');INSERT INTO menu VALUES( '14', '中国文学', '2', '13');INSERT INTO menu VALUES( '15', 'php', '4', '4');INSERT INTO menu VALUES( '16', 'mysql', '4', '4');*/?>

我们先来看我实现无限分类的具体过程。

题设:类似淘宝的商品分类,可以在任意分类设置其子类。  

一、创建`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是代表顶级分类

 

接着我们为{电脑}添加几个个子分类

 代码如下

INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '2', '台式'), (NULL, '2', '笔记本');这里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(empty($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代表顶级开始分,只要把数组放进去就可以分了

编辑:编程 本文来源:我们先来看我实现无限分类的具体过程,id 菜单

关键词: