php 权限管理对节点控制,我对权限控制系统的看法-PHP教程,PHP应用

请大家给个思路! —- 刁馋

# 我曾经做了一个权限控制系统,由于需要修改,而我没有找到有效的解决方法,

# 请大家给出出主意,给个大体思路,谢谢!要求如下:

# 1.每个父亲节点下边有多个孩子

# 2.每个孩子可能有一个父亲,还可能有多个父亲(多个父亲的级别可能不同,也

#   就是有交叉现象)

# 3.每个父亲可能管理相同的孩子或者不同的孩子

# 4.每个父亲登陆的时候,只能看到自己的孩子(如果管理的孩子不同,则登陆的

#   父亲只能看到自己下边的孩子,如果相同,那么他们看到的孩子都一样)

# 5.每个父亲可以添加自己的父亲(孩子?)

由问题的提出,可得到如下树状结构。关键在于如何保存这个树和怎样检索。

–0–                          000 (虚拟的根)

|

+——————-+—————+

–1–      001                 002             003

|                   |               |

+–+–+           +—-+—-+       +–+–+

–2–   003   004         004  006  007     007   008

|           |                 |

|        +–+–+           +–+–+

–3–         007      003   008         001   002

|

+—-+—-+

–4–             005  007  006

其中004登录后,应看到(1,001)-[2,004]-(3,007)和(1,002)-[2,004]-(3,003)-(4,007)等

而不应看到(1,003)-(2,007)。

即所有用户在登录后向下搜索孩子,可能在多个分支上进行。

设有两张表

表一保存所有成员的信息(以下简称u),主键id_u

表二为成员间的关系(以下简称k),主键id

u

id_u | name | …

——-+——+—-

001  |      |

002  |      |

003  |      |

004  |      |

005  |      |

006  |      |

…  |      |

k

id  | id_u | level | next | previons | right

—–+——+——-+——+———-+——-

1  |  001 |     1 |    2 |          |    5

2  |  003 |     2 |      |        1 |    3

3  |  004 |     2 |    4 |        1 |

4  |  007 |     3 |      |        3 |

5  |  002 |     1 |    6 |          |   14

6  |  004 |     2 |    7 |        5 |   12

7  |  003 |     3 |    9 |        6 |    8

8  |  008 |     3 |      |        6 |

9  |  005 |     4 |      |        7 |   10

10  |  006 |     4 |      |        7 |   11

11  |  007 |     4 |      |        7 |

12  |  006 |     2 |      |        5 |   13

13  |  007 |     2 |      |        5 |

14  |  003 |     1 |   15 |          |

15  |  007 |     2 |   16 |       14 |   18

16  |  001 |     3 |      |       15 |   17

17  |  002 |     3 |      |       15 |

18  |  008 |     2 |      |       14 |

其中:level 保存级别, next 保存下级的id, previons 保存上级的id, right 保存右邻的id

关于具体的数据组织视算法而定。

数的遍历算法,是很经典的了!

建议用数组计算,即一次性读入到数组,效率可能高一点

测试例,previons项未用

$ar = array(

0,

array(id=> 1,id_u=>"001", level=>1, next=> 2, previons=> 0, right=> 5),

array(id=> 2,id_u=>"003", level=>2, next=> 0, previons=> 1, right=> 3),

array(id=> 3,id_u=>"004", level=>2, next=> 4, previons=> 1, right=> 0),

array(id=> 4,id_u=>"007", level=>3, next=> 0, previons=> 3, right=> 0),

array(id=> 5,id_u=>"002", level=>1, next=> 6, previons=> 0, right=>14),

array(id=> 6,id_u=>"004", level=>2, next=> 7, previons=> 5, right=>12),

array(id=> 7,id_u=>"003", level=>3, next=> 9, previons=> 6, right=> 8),

array(id=> 8,id_u=>"008", level=>3, next=> 0, previons=> 6, right=> 0),

array(id=> 9,id_u=>"005", level=>4, next=> 0, previons=> 7, right=>10),

array(id=>10,id_u=>"006", level=>4, next=> 0, previons=> 7, right=>11),

array(id=>11,id_u=>"007", level=>4, next=> 0, previons=> 7, right=> 0),

array(id=>12,id_u=>"006", level=>2, next=> 0, previons=> 5, right=>13),

array(id=>13,id_u=>"007", level=>2, next=> 0, previons=> 5, right=> 0),

array(id=>14,id_u=>"003", level=>1, next=>15, previons=> 0, right=> 0),

array(id=>15,id_u=>"007", level=>2, next=>16, previons=>14, right=>18),

array(id=>16,id_u=>"001", level=>3, next=> 0, previons=>15, right=>17),

array(id=>17,id_u=>"002", level=>3, next=> 0, previons=>15, right=> 0),

array(id=>18,id_u=>"008", level=>2, next=> 0, previons=>14, right=> 0)

);

//print_r($ar);

function tree($ar,$i,$key,$level) {

if($ar[$i][id_u] == $key || $ar[$i][level] > $level) {

for($j=0;$j

echo "    ";

echo "+–";

echo $ar[$i][id_u]."
";

if($ar[$i][next] > 0)

tree($ar,$ar[$i][next],$key,$level);

}

if($ar[$i][right] > 0)

tree($ar,$ar[$i][right],$key,$level);

}

$keys = array("001","002","003","004","005","006","007","008");

while(list($key,$value) = each($keys)) {

echo "===> $value
";

for($i=1;$i<=count($ar);$i++) {

if($ar[$i][id_u] == $value) {

echo "    [$value]
";

tree($ar,$i,$value,$ar[$i][level]);

}

}

}

?>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值