关于按位的PHP问题

时间:2011-07-19 14:25:52

标签: php bitwise-operators

我有一个像这样的剧本

$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个数组值

抱歉,我真的无法用英语解释,希望你理解......

4 个答案:

答案 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