обратное проектирование битовых масок для получения списка разрешений
Я работаю с разрешениями, представленными битовыми масками. Эти разрешения являются
$permissionMap = [
'VIEW' => 1;
'CREATE' => 2;
'EDIT' => 4;
'DELETE' => 8
'UNDELETE' => 16;
'OPERATOR' => 32;
'MASTER' => 64;
'OWNER' => 128;
];
Если я объединю несколько разрешений, скажем VIEW
,EDIT
, и DELETE
, чтобы получить битовую маску 13. Можно ли перепроектировать это целое число, чтобы узнать, какие разрешения использовались для его создания?
function getPermissions($mask, $permissionMap) {
// use $permissionMap to return string[]
}
$viewEditAndDelete = 1 | 4 | 8; // 13
getPermissions($viewEditAndDelete, $permissionMap); // ['VIEW', 'EDIT', 'DELETE']
2
1 answers
Просто проверьте, установлена ли определенная маска. На самом деле это довольно просто, если мы пройдемся по $map
и проверим, установлен ли его флаг:
function getPermissions($mask, $permissionMap) {
$permissions = [];
foreach( $permissionMap as $perm => $val )
if( $mask & $val )
array_push( $permissions, $perm );
return $permissions;
}
2
Author: Sunny Patel, 2014-05-02 00:32:42