答案:请大家给个思路! ---- 刁馋
# 我曾经做了一个权限控制系统,由于需要修改,而我没有找到有效的解决方法,
# 请大家给出出主意,给个大体思路,谢谢!要求如下:
# 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=&
上一个:判断在线用户的方法
下一个:国外好东西真的多,现在贴上一个访问ACCESS的类!