如何使用位字段存储星期几?

马丁·比恩

我正在重构应用程序,其中一个数据库表将一周中的几天存储在列中。每天可以“打开”或“关闭”。

开和关的概念使我认为可以更简洁地将这些数据表示为位。但是我以前没有使用原始位作为数据类型。

该应用程序是用PHP编写的。我已经看到了用于存储标头值位在这里有那么“助手”常数(HEADER_X_FORWARDED_ALLHEADER_X_FORWARDED_ALL充当“预配置”用于所有标题被使用,或在使用的子集,用于AWS ELB状环境(其中一些头不被发送,所以是“关”) 。

所以我有几个问题使用这种数据类型来表示星期几:

  1. 如何在MySQL中存储最终位值?如列数据类型,长度等

  2. 我如何检查一天是“开”?如果我有值0b0100000,如何确定按位运算符星期二在“开”?

  3. 如何“设置”日期以将值持久存储在数据库中?因此,如果我在UI中具有将值作为数组提交的复选框,我将如何转换类似以下内容的内容:

Array
(
    [days] => Array
        (
            [Monday] => 0
            [Tuesday] => 1
            [Wednesday] => 0
            [Thursday] => 0
            [Friday] => 0
            [Saturday] => 0
            [Sunday] => 0
        )
)

0b0100000再次使用按位运算符,得到一个类似于的值

如果有人可以指出正确的方向开始使用PHP中的位值,我将不胜感激!

比利翁坎

您可以存储所选日期的十进制值。因此,作为一个非常基本的示例:

/**
 * Keys are ISO-8601 numeric representation
 * of the days of the week
 */
$days = [
    1 => 0b0000001, // Monday    =>  1
    2 => 0b0000010, // Tuesday   =>  2
    3 => 0b0000100, // Wednesday =>  4
    4 => 0b0001000, // Thursday  =>  8
    5 => 0b0010000, // Friday    => 16
    6 => 0b0100000, // Saturday  => 32
    7 => 0b1000000, // Sunday    => 64
];

您只需循环检查值中的日期位是否设置(按位和):

// The value you'd store in your database
$mondayToFriday = 31; // 1 + 2 + 4 + 8 + 16

foreach ($days as $n => $v) {
  
    /**
     * Get the day's name using strftime (has locale capability)
     * strtotime("Sunday +n days") would work with ISO-8601 day
     * numbers or PHP's date("w") (0 - 6 / Sunday - Saturday)
     */
    $day = strftime("%A", strtotime("Sunday +{$n} days"));


    echo "{$day}: " . (($v & $mondayToFriday) ? "Y" : "N") . PHP_EOL;

}

至于您的复选框,您可以只根据每天的状态(0或1)构建二进制字符串,然后使用将该字符串转换为十进制bindec()(它们在数组中的显示顺序很重要,您需要确保它们已正确映射到其相应的当天的值)。

给定您的示例输入以及该示例中的日期,将可以进行以下操作:

$dec = bindec(strrev(implode("", $input["days"])));

希望这能将您推向正确的方向。

这是一个例子

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章