我建议转换二进制状态字符串和以后的权限(权利),将其存储在数据库中作为长整数或十六进制字符串(VARCHAR;用于存储大量的权利)。
例
$privileges_list = array(
0 => 'create_file',
1 => 'read_file',
2 => 'update_file',
3 => 'delete_file',
4 => 'create_pool',
5 => 'vote_in_pool',
6 => 'create_gallery',
7 => 'upload_images',
8 => 'view_statistics'
);
所以,如果你想设置create file
,update file
和view statistics
权限的用户只是把1上的适当位置字符串为他们的休息(0,2,8)和0
$binary_string = "100000101";
此字符串中最后一个字符的位置为0,第一是位置8
现在你可以在这个字符串转换为teger(261)或十六进制数字(105),并将其放入数据库作为该用户的权限集(我更喜欢十六进制)。
要将此值转换回权限列表,你可以使用这样的事情
function hexvalue2privileges($hexvalue, $plist) {
$res = array(); $res_assoc = array();
for ($i = strlen($hexvalue) - 1; $i >= 0; $i--) {
$bin = str_pad(decbin(hexdec(substr($hexvalue, $i, 1))), 4, '0', STR_PAD_LEFT);
$bin_array = array_reverse(str_split($bin, 1));
foreach ($bin_array as $bitstate) $res[] = $bitstate == '1' ? true : false;
}
foreach ($plist as $key => $id) {
$res_assoc[$id] = $res[$key];
}
return $res_assoc;
}
,并调用这个函数
print_r(hexvalue2privileges('105', $privileges_list));
输出将被
Array
(
[create_file] => 1 // true
[read_file] => // false
[update_file] => 1 // true
[delete_file] => // false
[create_pool] => // false
[vote_in_pool] => // false
[create_gallery] => // false
[upload_images] => // false
[view_statistics] => 1 // true
)
随着每一个十六进制字符,你可以存储4个权利,以便计算需要使用的字符数穆拉
$chars_needed = floor((count($privileges_list)-1)/4) + 1; // result 3
为了得到二进制串的总长度
$binary_length = $chars_needed * 4; // result 12
要解决的特权长度设置
$binary_string = "100000101";
$binary_string = str_pad($binary_string, $binary_length, '0', STR_PAD_LEFT);
// result '000100000101'
要转换$ binary_string为十六进制
$binary_string = "000100000101";
$hexvalue = "";
$groups = str_split($binary_string, 4);
foreach ($groups as $group) $hexvalue .= dechex(bindec($group));
// result $hexvalue='105' (1=0001, 0=0000, 5=0101)
而且你可以创建组并通过为每个组(管理员,主持人,客人,贵宾等)设置权限来将其分配给用户。
希望这有助于
哪种语言? – skaffman 2011-04-14 15:43:28
我建议您使用长整数。非常轻,非常强壮。你需要什么(C++,(My)SQL等)? – elslooo 2011-04-14 15:44:16
是否会有超过31或32个访问权类型? – 2011-04-14 15:47:25