多级审核状态的变更
最近要写一个审核的功能:5个层级审核,打算用一个status状态位记录每一层级审核是否通过。很少用到位操作,因此记录下。
设置当前审核阶段状态位
<?php
function setStatus($status, $stage, $is_approved)
{
$arr_a = array_map(function ($val) {
return 1 << $val;
}, range(0, 4));
$arr_r = array_map(function ($val) {
return $val - 1;
}, $arr_a);
if ($is_approved == 1) {
$status_up = $status | $arr_a[$stage - 1];
} else {
$status_up = $status & $arr_r[$stage - 1];
}
return $status_up;
}
$status = 0;
echo '<pre>';
for ($i = 1; $i <= 5; $i++) {
$status = setStatus($status, $i, 1);
var_dump("stage {$i} approved,status: {$status}");
}
var_dump('-------------');
$status = 0;
$stage = 1;
$status = setStatus($status, $stage, 1);
var_dump("stage {$stage} approved,status: {$status}");
$stage++;
$status = setStatus($status, $stage, 1);
var_dump("stage {$stage} approved,status: {$status}");
$stage++;
$status = setStatus($status, $stage, 0);
var_dump("stage {$stage} rejected,status: {$status}");
检查某个阶段状态位
<?php
function getStatusBit($status, $stage)
{
$bStr = decbin($status);
$bPos = strlen($bStr) - $stage;
return isset($bStr[$bPos]) ? intval($bStr[$bPos]) : 0;
}
$status = 26; // 二进制 11010
var_dump(getStatusBit($status, 1)); // 0
var_dump(getStatusBit($status, 2)); // 1
var_dump(getStatusBit($status, 3)); // 0
var_dump(getStatusBit($status, 4)); // 1
var_dump(getStatusBit($status, 5)); // 1
检查之前阶段的状态位
function checkStatus($status, $stage)
{
$arr_a = array_map(function ($val) {
return pow(2, $val + 1) - 1;
}, range(0, 4));
$flag = false;
if ($status == 0 && $stage == 0) {
$flag = true;
} else if ($stage >= 1) {
$flag = isset($arr_a[$stage - 1]) && $status == $arr_a[$stage - 1];
}
return $flag;
}
var_dump(checkStatus(0, 0)); // true
var_dump(checkStatus(1, 1)); // true
var_dump(checkStatus(3, 2)); // true
var_dump(checkStatus(7, 3)); // true
var_dump(checkStatus(15, 4)); // true
var_dump(checkStatus(31, 5)); // true
var_dump(checkStatus(15, 5)); // false