marcus-ma / myBlog

写写开发笔记

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

位运算解决数据表状态枚举类问题

marcus-ma opened this issue · comments

情景导入

有一张记录问题处理进度的数据表,原字段有三:主键id、问题名称、处理的状态[0:未处理/1:已处理]。现在来了个需求,想将处理的状态记录得详细点,如记录是否经过UI的二次修改、是否经过技术的重构、是否经过CTO的review等等。

初次想法

一开始是的想法是:直接增加表的相应状态字段,但对于表中数据比较多,直接修改表结构不太好。
之后的想法是:每经过一个状态就插入一条数据,处理的状态[0:未处理/1:UI/2:技术……],但表会越来越大

更好的办法

后来找到一个更好的处理办法:将处理的状态值改为用2的幂次方表示,每到一个状态,就将该状态对应的值累加上。
如[1:未处理/2:UI/4:技术/8:CTO/16:已处理],若有一问题经过UI、技术、CTO的处理,则该状态值为1+2+4+8=15。
这样的好处是:表结构不用进行修改,表数据不会增加过多。

数据展示

如果要列出该问题的处理过程时,可以将状态值进行分解(位运算),就可以得出处理阶段的对应值

function status($statusSum){
    $wei = [1,2,4,8,16];
    $statusVals = array_filter($wei,function($var) use($statusSum){
        return($var & $statusSum);
    });
    var_dump($statusVals);
}

status(15);
//[1,2,4,8]

结果

问题解决,同时也了解到位运算还有这操作