2016-05-13 9 views
0

Ich versuche ausgewählte Wochentage in einem Feld in DB zu speichern. Bitweise scheint dafür perfekt zu sein, aber PHP gibt nicht das erwartete Ergebnis, und ich weiß nicht warum.PHP bitweise zum Speichern von Wochentagen

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

so wählen Di und Fr: 18 (0100100)

und zum Beispiel Sonntag zu überprüfen, ob gewählt wird: decbin(18) & decbin(64) (sollte "leer" zurück), aber die reuslts sind unerwartet.

+0

Warum sie nicht als int speichern - > (1-6)? –

Antwort

1

Das liegt daran, dass Sie diese Binärzeichenfolgen mit führenden Nullen auf die gleiche Länge auffüllen müssen. Decbin() erstellt eine Zeichenfolge, die führende Nullen verwirft. Sie sind and ing Strings wie:

10010  // 18 
1000000 // 64 

verwenden entweder str_pad() zu führenden Nullen zu einer festen Länge hinzufügen oder einen Funktionsaufruf speichern und verwendet sprintf sowohl die Basis-Konvertierung und die Polsterung in einem einzigen Schritt

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

Sie müssen nicht mit binären Zeichenfolgen arbeiten, um mit Bit-Flags zu arbeiten. Deklarieren Sie Ihre Tage als Ganzzahlen 1,2,4,8 usw.

Um einen Wert, der Montag und Freitag ist, nur binär ODER die Werte zu machen. Um zu überprüfen, ob eine Zahl einen Tag enthält, binäre AND sie und überprüfen Sie, ob das Ergebnis dem Tag Ihrer Überprüfung entspricht.

Obwohl dies technisch allesamt binäre Operationen sind, müssen Sie die Binärzeichenfolgen nicht wirklich sehen oder verwenden.

Einige Beispiele mit den Dump-Ergebnisse unter ... bitte meine Verwendung von Extrakt zu ignorieren, es war einfach schneller auf diese Weise

<?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); 
?> 

und der Ausgang

/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) 
Verwandte Themen