写了个属性码判定思路

//普通权限编码

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种属性以及这些属性组合形成的排异态。

C
1