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

问题描述 投票:2回答:1

我正在重新分解应用程序,其中一个数据库表以列的形式存储一周中的几天。每一天都可以“开启”或“关闭”。

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

该应用程序是用PHP编写的。我见过用于存储标头值here的位。然后有“辅助”常量(HEADER_X_FORWARDED_ALLHEADER_X_FORWARDED_ALL作为所有正在使用的标头的“预配置”,或者用于类似AWS ELB的环境的子集(其中一些标头未发送,因此“关闭”) “)。

所以我有几个问题使用这种数据类型来表示几周中的几天:

  1. 我如何在MySQL中存储最终的比特值?如列数据类型,长度等。
  2. 我怎么检查一天是“开启”?如果我有值0b0100000,我如何确定使用bitwise operators周二是“开启”?
  3. 如何“设置”日期以保留数据库中的值?因此,如果我在UI中有将数值作为数组提交的复选框,我将如何转换如下内容:
Array
(
    [days] => Array
        (
            [Monday] => 0
            [Tuesday] => 1
            [Wednesday] => 0
            [Thursday] => 0
            [Friday] => 0
            [Saturday] => 0
            [Sunday] => 0
        )
)

...有点像0b0100000,再次使用按位运算符?

如果有人能指出我正在开始使用PHP中的位值的方向,我将非常感激!

php mysql database bit
1个回答
0
投票

您可以存储所选日期的小数值。所以作为一个非常基本的例子:

/**
 * 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"])));

希望这会把你推向正确的方向。

Here's an example to play with

© www.soinside.com 2019 - 2024. All rights reserved.