سؤال

This is slightly OT for SO, because I'm not trying to solve a specific problem, instead just to understand how something might be implemented. But I am after code, so let's see how it goes...

Let's say we had a checkbox for each day of the week, and we decided to store any combination of those checkboxes as a single number, such that:

  0 = no days
  1 = Monday 
  2 = Tuesday
  4 = Wednesday
  8 = Thursday
 16 = Friday
 32 = Saturday
 64 = Sunday
127 = everyday

How might one go about implementing that logic in PHP so that if I submitted say, "13", PHP would know to tick only the Monday, Wednesday and Thursday checkboxes?

هل كانت مفيدة؟

المحلول

Bitwise ANDs:

$input = 13;

if( $input & 1 ) {
  echo 'Monday';
}
if( $input & 2 ) {
  echo 'Tuesday';
}
if( $input & 4 ) {
  echo 'Wednesday';
}
// etc

edit

You can avoid the ifs with something like:

$input = 13;

$days = array('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun');

for( $i=0; $i<7; $i++ ) {
    $daybit = pow(2,$i);
    if( $input & $daybit ) {
        echo $days[$i] . ' ';
    }
}

//output: mon wed thu

There's more than these two ways to skin this particular cat, but the 'best' way depends on what your result/output needs to be.

نصائح أخرى

As to avoid code structure duplication (lots of similar if clauses) and introducing extra "magic" numbers (2, 7), as shown Sammitch's working suggestions, I'd prefer the following.

$daymap = array(
    1 => Monday,
    2 => Tuesday,
    4 => Wednesday,
    8 => Thursday,
    16 => Friday,
    32 => Saturday,
    64 => Sunday
);

$input = 13;

foreach ($daymap as $code => $name) {
    if ($input & $code) {
        echo $name.' ';
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top