PHP 按位存储星期几

PHP bitwise to store days of the week

我正在尝试将选定的工作日存储在数据库中的一个字段中。 Bitwise 似乎是完美的,但 PHP 没有给出预期的结果,我不知道为什么。

mon tue wnd thu fri sat sun
1   1   1   1   1   1   1
1   2   4   8   16  32  64

所以到 select 周二和周五:18 (0100100)

例如,要检查星期日是否为 selected:decbin(18) & decbin(64)(应该 return "empty"), 但是结果出乎意料

那是因为您需要将那些带有前导零的二进制字符串左填充到相同的长度。 decbin() 创建一个丢弃任何前导零的字符串。您正在 anding 字符串,例如:

10010      // 18
1000000    // 64

也可以使用 str_pad() 将前导零添加到固定长度,或者保存函数调用并使用 sprintf 一步完成基本转换和填充

sprintf('%08b', 18) & sprintf('%08b', 64)

您根本不必使用二进制字符串来使用位标志。 将您的日期声明为整数 1、2、4、8 等

要使星期一和星期五的值只是二进制或值。 检查一个数字是否包含一天,二进制和它们并检查结果是否等于您检查的那一天。

虽然从技术上讲这些都是二进制操作,但实际上您不必看到或使用二进制字符串。

下面是转储结果的一些示例...请忽略我对提取的使用,这样更快

<?php
// Day names
$dayNames = array(
    'monday',
    'tuesday',
    'wednesday',
    'thursday',
    'friday',
    'saturday',
    'sunday',
);

// Bit values
$dayValues = array();
foreach($dayNames as $key => $value) {
    $dayValues[$value] = 1 << $key;
}
var_dump($dayValues);
extract($dayValues);


// Monday and Tuesday
$monANDtue = $monday | $tuesday;
var_dump($monANDtue);
var_dump(decbin($monANDtue));



// Monday and Sunday
$monANDsun = $monday | $sunday;
var_dump($monANDsun);
var_dump(decbin($monANDsun));



// Is on Monday?
$isOnMonday = ($monANDsun & $monday) == $monday;
var_dump($isOnMonday);

// Is on Tuesday?
$isOnTuesday = ($monANDsun & $tuesday) == $tuesday;
var_dump($isOnTuesday);

// Is on Tuesday?
$isOnSunday = ($monANDsun & $sunday) == $sunday;
var_dump($isOnSunday);
?>

和输出

/vhost/virtual/sandbox/public/index.php:27
array(7) {
    [monday] = int(1) 1
    [tuesday] = int(1) 2
    [wednesday] = int(1) 4
    [thursday] = int(1) 8
    [friday] = int(2) 16
    [saturday] = int(2) 32
    [sunday] = int(2) 64
}

/vhost/virtual/sandbox/public/index.php:33
int(1) 3

/vhost/virtual/sandbox/public/index.php:34
string(2) "11"

/vhost/virtual/sandbox/public/index.php:40
int(2) 65

/vhost/virtual/sandbox/public/index.php:41
string(7) "1000001"

/vhost/virtual/sandbox/public/index.php:47
bool(true)

/vhost/virtual/sandbox/public/index.php:51
bool(false)

/vhost/virtual/sandbox/public/index.php:55
bool(true)