<?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, чтобы в двоичном коде соответствующий флаг совпадал с указанным вами разрешением.
Битовое И (&
) говорит (когда оно достигает Менеджер ):
$flags $Pemissions $flags
if (00001000 & 00011000) == 00001000
if (00001000) == 00001000 [true]
По сути, если флаг установлен с обеих сторон (как значение, которое вы проверяете, так и против), сохраните этот бит. Затем убедитесь, что оно по-прежнему равно значению, которое вы проверяете. Если это так, пользователь получает это разрешение. AND имеет значение true, только когда оба левые и правые значения имеют установленные биты.