Пару дней назад, мне понадобилось компактно хранить информацию о правах пользователя в базе данных MySQL. Только начав изучать программирование, я считал, что идеалом хранения прав было перечисление флагов через |
$a = '0|1|0|0|0|1|1|';
После чего информация распарсивалась функцией explode();, и по ключам выводилась информация. Данная структура была не эффективной и грузоемкой. А так же, требовала место в базе varchar(255).
Размышляя над новой системой, я вспомнил разговор меня и создателя AloneIslands.Ru (sL), он говорил о масках… вспомнив пример, я поспешил проделать опыты… Воспользовавшись гуглом и помощью друзей, я разобрался с данной системой и спешу поведать Вам о, не новой, но удобной системе.
Так вот, предположим, у нас есть определенные ключи…
$r = 1 << $i++; // 1,2,4,8...
Нам нужно получить число (маску), которое будет соответствовать 1 и 8…
Мною была написана маленькая функция, которая генерирует маску по нужным ключам
function gen_mascka($ar)
{
$r = 0;
foreach ( $ar as $t) $r |= $t;
return $r;
}
$masc = gen_mascka(Array(1,8)); // 9
Далее, проверяем на соответствие
$res = ( $masc & 1 ) ? true : false;
Если ключ присутствует, то выводит true, в противном случае — false.
Про бинарные операции почитать можно