mysql部门无限分类_mysql 无限级分类

两种思路吧,递归 和 非递归

递归

$arr = [

1=>['id'=>1,'pid'=>0],

2=>['id'=>2,'pid'=>0],

3=>['id'=>3,'pid'=>1],

4=>['id'=>4,'pid'=>1],

5=>['id'=>5,'pid'=>0],

6=>['id'=>6,'pid'=>3],

7=>['id'=>7,'pid'=>6],

8=>['id'=>8,'pid'=>3],

9=>['id'=>9,'pid'=>4],

10=>['id'=>10,'pid'=>7],

11=>['id'=>11,'pid'=>7],

];

//排序数组arr 层数level 键val

function display_test($arr,$level,$val){

if($level==0)

{

echo "顶级目录\n";

}else{

echo str_repeat(' ',$level).$arr[$val]['id']."\n";

}

$temp = get($arr,$val);

foreach ($temp as $v)

{

display_test($arr,$level+1,$v['id']);

}

}

//获取 pid的所有下一级子节点

function get($arr,$pid)

{

$res = [];

foreach ($arr as $v)

{

if($v['pid']==$pid)

{

$res[] = $v;

}

}

return $res;

}

display_test($arr,0,0);die;

非递归 左右值法

表结构

CREATE TABLE `sys_department` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(20) DEFAULT NULL COMMENT '部门名称',

`description` varchar(200) DEFAULT NULL COMMENT '描述',

`create_time` int(11) DEFAULT NULL COMMENT '添加时间',

`left_value` int(11) DEFAULT NULL,

`right_value` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='部门表'

添加新下级:用事物

//修改右值

$sql = "UPDATE {$this->table} SET right_value = right_value+2 WHERE right_value>=:right_value";

//修改左值

$sql = "UPDATE {$this->table} SET left_value = left_value+2 WHERE left_value>=:left_value";

//插入

$sql = "INSERT INTO {$this->table}(name,description,left_value,right_value,create_time) VALUES(:name,:description,:left_value,:right_value,:create_time)";

删除节点: 用事物

//删除

$sql = "DELETE FROM {$this->table} WHERE left_value>=:left_value AND right_value<=:right_value";

//修改左值

$sql = "UPDATE {$this->table} SET left_value=left_value-{$offset} WHERE left_value>:left_value";

//修改右值

$sql = "UPDATE {$this->table} SET right_value=right_value-{$offset} WHERE right_value>:right_value";

获取所有节点,包含缩进

public function display_tree($id){

//获取节点

$model = $this->model->getById($id);

if(!$model)

{

return false;

}

$left = $model['left_value'];

$right = $model['right_value'];

//获取子节点 按left_value排序

$res = $this->getByLeftRight($left,$right);

$temp = [];

//循环找出节点所在级数

foreach ($res as $k=>$v)

{

if(count($temp)>0)

{

// 检查我们是否应该将节点移出堆栈

while ($temp[count($temp) - 1] < $v['right_value']) {

array_pop($temp);

}

}

//echo str_repeat("*",count($temp)).$v['name']."\n";

$res[$k]['level'] = count($temp);

$temp[] = $v['right_value'];

}

//level 第几层

return $res;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值