写了个属性码判定思路
//普通权限编码
function _B8_ENC($a){
if(!$a){return 0;}
$z='';
for($i=1;$i<=8;$i++){$z.=in_array($i,$a)?1:0;}
return base_convert($z,2,10);
}
//普通权限解码
function _B8_DEC($a){
if(!$a){return array();}
$z=array();
foreach(str_split(sprintf('%08d',base_convert($a,10,2))) as $a=>$b){if($b){$z[]=$a+1;}}
return $z;
}
//普通权限扩展
function _B8_EXT($a){
if(!$a){return array();}
$a=array_intersect($a,array(1,2,3,4,5,6,7,8));
$z=array();
for($i=1;$i<256;$i++){
$b=sprintf('%08d',base_convert($i,10,2));
foreach($a as $_a){if(!substr($b,$_a-1,1)){continue 2;}}
$z[]=$i;
}
return $z;
}
//冲突权限编码
function _B16_ENC($a){
if(!$a){return 0;}
$z='';
for($i=1;$i<=6;$i++){$z.=in_array($i+10,$a)?1:0;}
return base_convert($z,2,10)+20;
}
//冲突权限解码
function _B16_DEC($a){
if(!$a){return array();}
$z=array();
foreach(str_split(sprintf('%06d',base_convert($a-20,10,2))) as $a=>$b){if($b){$z[]=$a+11;}}
return $z;
}
//冲突权限扩展(用户初始化也用)
function _B16_EXT($a){
if(!$a){return array();}
$a_=array_diff(array(11,12,13,14,15,16),$a);
$z=array();
for($i=1;$i<64;$i++){
$b=sprintf('%06d',base_convert($i,10,2));
foreach($a_ as $_a){if(substr($b,$_a-11,1)){continue 2;}}
$z[]=$i+20;
}
return $z;
}
//冲突标签触发
function _B16_TAG($a){
if(!$a){return array();}
_INIT();
$z=array();
foreach($GLOBALS[':B'] as $b=>$_b){
if($b<11||$b>16||!is_array($_b)){continue;}
foreach($_b as $t){$t=explode('.',$t);if(empty($t[0])||!in_array($t[0],$a)||(!empty($t[1])&&!in_array($t[1],$a))){continue;}$z[]=$b;}
}
return $z;
}
属性码是1字节存储0-255,$GLOBALS这个被淘汰了,回头改用变量。
可以记录8种属性以及这些属性组合形成的排异态。