我正在尝试将所选工作日存储在DB中的一个字段中。 Bitwise似乎是完美的,但PHP没有给出预期的结果,我不知道为什么。
mon tue wnd thu fri sat sun
1 1 1 1 1 1 1
1 2 4 8 16 32 64
所以选择Tue和Fri:18
(0100100)
例如,要检查是否选择了星期日:decbin(18) & decbin(64)
(应该返回“空”),
但重新出现是出乎意料的。
答案 0 :(得分:1)
那是因为你需要将带有前导零的二进制字符串左键填充到相同的长度。 decbin()创建一个丢弃任何前导零的字符串。你是and
字符串,如:
10010 // 18
1000000 // 64
使用str_pad()也可以将前导零添加到固定长度,或保存函数调用并使用sprintf一步完成基本转换和填充
sprintf('%08b', 18) & sprintf('%08b', 64)
答案 1 :(得分:1)
您根本不需要使用二进制字符串来处理位标志。 以整数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)