请大家给个思路! ---- 刁馋
# 我曾经做了一个权限控制系统,由于需要修改,而我没有找到有效的解决方法, # 请大家给出出主意,给个大体思路,谢谢!要求如下: # 1.每个父亲节点下边有多个孩子 # 2.每个孩子可能有一个父亲,还可能有多个父亲(多个父亲的级别可能不同,也 # 就是有交叉现象) # 3.每个父亲可能管理相同的孩子或者不同的孩子 # 4.每个父亲登陆的时候,只能看到自己的孩子(如果管理的孩子不同,则登陆的 # 父亲只能看到自己下边的孩子,如果相同,那么他们看到的孩子都一样) # 5.每个父亲可以添加自己的父亲(孩子?)
由问题的提出,可得到如下树状结构。关键在于如何保存这个树和怎样检索。
--0--000 (虚拟的根) | +-------------------+---------------+ --1--001 002 003 | | | +--+--+ +----+----+ +--+--+ --2-- 003 004 004006007 007 008 | | | |+--+--+ +--+--+ --3-- 007003 008 001 002 | +----+----+ --4-- 005007006
其中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<$ar[$i][level]-1;$j++) echo ""; echo "+--"; echo $ar[$i][id_u]."<br>"; 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<br>"; for($i=1;$i<=count($ar);$i++) { if($ar[$i][id_u] == $value) { echo "[$value]<br>"; tree($ar,$i,$value,$ar[$i][level]); } } } ?>
|