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 AND
s:
$input = 13;
if( $input & 1 ) {
echo 'Monday';
}
if( $input & 2 ) {
echo 'Tuesday';
}
if( $input & 4 ) {
echo 'Wednesday';
}
// etc
edit
You can avoid the if
s 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.' ';
}
}