Многие сталкивались с вопросом: как бы передать в запросе много условий как можно меньшим количеством переменных? Предлагаю познакомиться с типовым, но, к сожалению, непопулярным решением — передача ключей битовой маской .
Уверен, что можно опустить описание всего механизма как именно располагаются разряды и как происходит сохранение данных в битовой маске, и перейти непосредственно к выдуманной задачке.
Задача. Существует каталог киножанров и несколько фильмов. Каждый фильм может иметь привязку к нескольким жанрам. Необходимо вывести список фильмов с прикрепленными к ним жанрами.
Ну первое, что бросается в глаза это
Возникает вопрос: почему в жанры попал несуществующий ключ(тройка) ?
Ответ: ключ три — это битовая комбинация единицы и двойки.
Думаю, двадцать четыре, как комбинация восьмерки и шестнадцати, так же понятно.
Ну и остается вопрос: как проверить маску? Тут на помощь приходят элементарное условие «if», писать которое для проверки битовой маски никто не помнит как. А на самом деле все просто:
где $var — то значение, кое мы имеем, а $key — тот ключ, который мы ищем. Если операция возвращает более 0, точнее значение искомого ключа, то жанр мы сохраняем в карман.
Ну и неохваченная в примере кода область.
Допустим мы хотим к фильму «Аноним» добавить еще жанр «фантастика», который имеет ключ 16 в массиве. Для этого нам нужно добавить следующее:
Вертикальная черта и равно, и теперь наш «Аноним» имеет жанры «драма, фантастика».
или примитивнее:
Конечно, теперь не сложно переставить требуемый параметр в GET и потом поискать его в битовых масках. :)