对于SO来说这只是一点点OT,因为我不是要解决一个特定的问题,而只是为了理解某些事情的实现方式.但我是在代码之后,让我们看看它是怎么回事......
假设我们在一周中的每一天都有一个复选框,我们决定将这些复选框的任意组合存储为单个数字,这样:
0 = no days
1 = Monday
2 = Tuesday
4 = Wednesday
8 = Thursday
16 = Friday
32 = Saturday
64 = Sunday
127 = everyday
Run Code Online (Sandbox Code Playgroud)
如何在PHP中实现该逻辑,以便如果我提交说"13",PHP会知道只勾选周一,周三和周四复选框?
Sam*_*tch 16
按位ANDs:
$input = 13;
if( $input & 1 ) {
echo 'Monday';
}
if( $input & 2 ) {
echo 'Tuesday';
}
if( $input & 4 ) {
echo 'Wednesday';
}
// etc
Run Code Online (Sandbox Code Playgroud)
您可以使用以下内容来避免ifs:
$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
Run Code Online (Sandbox Code Playgroud)
除了这两种方法之外,还有两种方法可以去除这种特殊的猫,但"最佳"方式取决于你的结果/输出需要什么.
为了避免代码结构重复(许多类似的if条款)并引入额外的"魔术"数字(2,7),如Sammitch的工作建议所示,我更喜欢以下内容.
$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.' ';
}
}
Run Code Online (Sandbox Code Playgroud)