Использование битовых масок для управления большим набором полей в форме с категориями - PullRequest
1 голос
/ 09 июля 2020

Я использовал побитовые операторы и маски только один раз на SQL сервере много лет go. Это был простой переключатель флажков 2/4/8/16. На этот раз, прочитав многочисленные статьи и статью в Википедии о масках, я все еще не могу осмыслить это. Может быть, мое мышление здесь совершенно неверно, и я не могу использовать маски, но пока я также не нашел окончательной причины, почему бы и нет.

У меня 4 категории в моем форма в PHP со следующими значениями:

$category1 = ["one", "two", "three"];
$category2 = ["one", "two", "three"];
$category3 = ["one", "two"];
$category4 = ["one", "two", "three", "four"];

Тогда у меня есть огромное количество флажков, которые мне нужно показать / скрыть в зависимости от того, принадлежат ли они к определенной комбинации c этих категорий. Они могут принадлежать многим одновременно.

Допустим, у меня есть один флажок:

<input type="checkbox" name="some_name[]" value="some_value" />

Теперь этот флажок может отображаться в любой из этих комбинаций:

category1 = "one" AND category2 = "two" AND category3 = "one" AND category4 = "four"
category1 = "one" AND category2 = "one" AND category3 = "one" AND category4 = "one"
category1 = "one" AND category2 = "one" AND category3 = "two" AND category4 = "three"

Сначала я пробовал присвоить значения категориям, так что:

category1_value = 1 + <array_index_of_the_value+1>
category2_value = 10 + <array_index_of_the_value+1>
category3_value = 100 + <array_index_of_the_value+1>
category4_value = 1000 + <array_index_of_the_value+1>

Но я не могу понять как установить одно значение / класс / атрибут данных это позволило бы мне выполнить операцию с битовой маской, чтобы показать это, когда выбрана конкретная c комбинация категорий.

Затем я попытался умножить каждое число, но это даже не дало мне уникальные значения для каждой комбинации, такие же, как если бы я применил 2, 4, 8 и 16 соответственно к каждой категории, а затем просто умножил каждую комбинацию.

При написании этого поста я начал сомневаюсь, смогу ли я сделать это в одной маске. Потому что они не каскадные, а категоричные. Это означает, что большее число не допускает всех комбинаций "нижних" .

Однако я могу ошибаться и, возможно, есть способ. Любая помощь будет принята с благодарностью.

- edit

На самом деле, чтобы сделать вещи еще более сложными, $category4 на самом деле является каскадной категорией, что означает, что значение four должно отображать все one, two и three.

1 Ответ

0 голосов
/ 10 июля 2020

Не совсем уверен в полном контексте вашей проблемы, но если вы хотите однозначно идентифицировать комбинацию всех четырех категорий с одним числом, вам понадобится двоичное число 12 di git. Например ...

$category1 = [ 1 << 11,  1 << 10, 1 << 9 ];
$category2 = [ 1 << 8, 1 << 7, 1 << 6 ];
$category3 = [ 1 << 5, 1 << 4 ];
$category4 = [ 1 << 3, 1 << 2, 1 << 1, 1 << 0 ];  // Ie, 0b1000, 0b100, 0b10, 0b1

... таким образом, что ...

category1 = "one" AND category2 = "two" AND category3 = "one" AND category4 = "four"
category1 = "one" AND category2 = "one" AND category3 = "one" AND category4 = "one"
category1 = "one" AND category2 = "one" AND category3 = "two" AND category4 = "three"

... теперь можно представить как ...

if ( v === 0b100010100001 || v === 0b100100101000 || v === 0b100100010010 )

Это проще визуализировать, сначала записав двоичное число в кортежах по категориям. Например, последняя из трех строк: ...

  • category1 == "one": 100
  • category2 == "one": 100
  • category3 = = "два": 01
  • category4 == "три": 0010

... и, сложив их вместе, получаем ...

0b100100010010

Надеюсь, это поможет.

...