我有一个像这样的剧本
$job = array(
1 => 'User',
2 => 'Editor',
4 => 'Supervisor',
8 => 'Manager',
10 => 'President');
$value = 18;
foreach($job as $key => $val)
{
if($value & $key)
{
$job[] = $key;
echo $val.', ';
}
}
现在我想要实现的是,在上面的例子中,'18'系统必须只显示值为'经理,总统'(10 + 8 = 18;)
但是如果您运行脚本,系统将显示为Editor,President,
这不是我所有的数组,我还有23个数组值
抱歉,我真的无法用英语解释,希望你理解......
答案 0 :(得分:3)
<?php
$flags = array(
1 => 'User', // 00000001 Note the place of the 1
2 => 'Editor', // 00000010
4 => 'Supervisor', // 00000100
8 => 'Manager', // 00001000
16 => 'President' // 00010000
);
// permission we're going for
$permissions = 16 + 8; // 00011000 again, note the 1's places.
$levels = array();
foreach ($flags as $level => $name)
{
if (($permissions & $level) == $level)
$levels[] = $name;
}
echo implode(', ', $levels);
<强>输出:强>
Manager, President
您希望您的值为2的幂,以便在二进制中,相应的标志与您指定的权限相匹配。
按位AND(&
)说(当它到达经理时):
$flags $Pemissions $flags
if (00001000 & 00011000) == 00001000
if (00001000) == 00001000 [true]
基本上,如果双方都设置了标志(你要检查和反对的值),请保留该位。然后,确保它仍然等于您要检查的值。如果是,则将用户设置为该权限。 AND <仅当两者左侧和时,右侧值设置了位。
答案 1 :(得分:1)
总统的价值是错误的。要使用位域,所有数字必须是2的幂,所以总统应该是16而不是10。
注意16(十进制)是0x10(十六进制) - 也许将总统值设置为10(十进制)是复制/粘贴错误?
答案 2 :(得分:1)
你的问题是10不是2 ^ y变量。
10 = 2 + 8(2 ^ 1和2 ^ 3),因此将分别匹配值2和8。
如果你想像你那样允许按位选择;你需要为索引选择2 ^ y值(1,2,4,8,16,32等)。
然后你可以安全地将这些值添加为选择器(例如16 + 4(20),2 + 32(34)等)。
答案 3 :(得分:0)
你应该改变10到16(1,2,4,8,16,32,..)或者你可能无法理解某些数字。是10 = 10还是10 = 2 + 8