需求:

分类树是无限级别的,用户有部门的岗位两个属性。现需要将树跟据部门和岗位两个属性进行划分。

代码:

$catepv = "dw1(dep,mer),dw2(*),-dw2(dp,pw)";
$userpv = "dw2(pw1)";
function trans($pv){
$cate = split('\)\,',$pv);
foreach($cate as $c){
$p = split('\(',$c);
$v['dep'] = $p[0];
$_p = $p[1];
if(substr($_p,strlen($_p)-1)==")"){
$_p = substr($_p,0,strlen($_p)-1);
}
$v['job'] = split(',',$_p);
$_v[] = $v;
}
return $_v;
}

function pv_dep($d,$_u){
$all = false;
$f = false;
foreach($d as $_d){
if(trim($_d['dep']) == '*'){
$all = true;
}elseif(substr($_d['dep'],0,1)=='-' && substr($_d['dep'],1) == $_u['dep']){
if(count($_d['job'])==1 && $_d['job'][0] == '*'){
$f = false;
}
}elseif($_d['dep'] == $_u['dep']){
$f = true;
}
}
if($all||$f){
return true;
}else{
return false;
}
}

function pv_job($d,$_u){
$f = false;
$all = false;
$user=array();
foreach($_u['job'] as $uj){
echo '
check: '.$uj;
foreach($d as $_d){
if(substr($_d['dep'],0,1) == '-' && substr($_d['dep'],1) == $_u['dep']){
foreach($_d['job'] as $dj){
if($uj == $dj){
// echo '->lost by '.$dj;
$user[$uj] = false;
}
}
}elseif($_d['dep'] == $_u['dep']){
if(count($_d['job'])==1 && $_d['job'][0] == '*'){
$user[$uj] = true;
// echo '->get by '.$uj;
}else{
foreach($_d['job'] as $dj){
if($uj == $dj){
$user[$uj] = true;
}
}
}
}
}
}
if(count($user)==0){
return false;
}else{
foreach($user as $_ut){
if($_ut){
return true;
}
}
}
}
function pv($d,$u){

$d = trans($d);
$u = trans($u);
$_u = $u[0];
if (pv_dep($d,$_u)){
echo 'got dep.';
if (pv_job($d,$_u)){
echo '
Get';
}else{
echo '
Lost by Job!';
}
}else{
echo '
Lost by Department!';
}
}
pv($catepv,$userpv);

测试数据:(()以外表示部门()内表示岗位,*是通配符。下同)

    $catepv = "dw1(dep,mer),dw2(*),-dw2(dp,pw)";
    $userpv = "dw2(pw1)";

结果:Get

测试数据:

    $catepv = "dw1(dep,mer),dw2(p),-dw2(dp,pw)";
    $userpv = "dw2(pw1)";

结果:Lost by Job!

测试数据:

    $catepv = "dw1(dep,mer),dw2(p),-dw2(dp,pw)";
    $userpv = "dw3(pw1)";

结果:Lost by Job!

 

测试数据:

    $catepv = "dw1(dep,mer),dw2(*),-dw2(dp,pw)";
    $userpv = "dw2(pw1)";

结果:Get