【问题标题】:PHP bitwise to store days of the weekPHP按位存储星期几
【发布时间】:2016-09-09 08:48:22
【问题描述】:

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

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

所以选择周二和周五:18 (0100100)

例如,检查是否选择了星期日:decbin(18) & decbin(64)(应返回“空”), 但结果出乎意料。

【问题讨论】:

  • 为什么不将它们存储为 int -> (1-6) ?

标签: php bitwise-operators dayofweek


【解决方案1】:

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

10010      // 18
1000000    // 64

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

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

【讨论】:

    【解决方案2】:

    您根本不必使用二进制字符串来处理位标志。 将您的日子声明为整数 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)
    

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 1970-01-01
      • 2016-10-22
      • 2015-05-13
      • 2022-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多