2016-05-13 67 views
0

我試圖將選定的工作日存儲在數據庫中的一個字段中。 Bitwise似乎是完美的,但PHP並沒有給出預期的結果,我不知道爲什麼。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)(應返回 「空」), 但reuslts是意想不到的。

+0

爲什麼不將它們存儲爲INT更快 - >(1-6)? –

回答

1

這是因爲您需要將這些具有前導零的二進制字符串左鍵填充到相同的長度。 decbin()創建一個丟棄任何前導零的字符串。你and荷蘭國際集團的字符串,如:

10010  // 18 
1000000 // 64 

要麼使用str_pad()太加前導零固定長度,或保存函數調用,並用sprintf在一個單一的步驟做這兩個基本轉換和填充

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

您不必使用二進制字符串來處理位標誌。 聲明你的日子爲整數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)