Бинарные операторы для использования в операторе switch

У меня есть 2 логические переменные $products_changed а также $address_changed,

Я хочу отобразить визуальный индикатор для каждого из статусов:

  • оба верны
  • только products_changed правда
  • только address_changed правда

В настоящее время я занимаюсь:

  if ($products_changed && $address_changed) //if both have changed
{
//visual indicator for both
}
elseif ($products_changed) //only products changed
{
//visual indicator for products changed
}
elseif ($address_changed)  //only address changed
{
//visual indicator for address changed
}

Мне нужен логический / математический оператор, который я могу применить и в результате будет содержать, являются ли оба значения истинными или оба ложными. Однако, если верно только одно — мне нужно знать, какой (первый или второй).

Вот как я хотел бы реорганизовать мой код:

const BOTH_CHANGED = 1, PRODUCTS_CHANGED = 2, ADDRESS_CHANGED = 3;
//The numbers 1,2,3 are arbitrary, could be any numbers.

$visual_indicator = $products_changed **SOME_OPERATOR** $address_changed;

switch( $visual_indicator) {
case BOTH_CHANGED: //display visual indicator for both changed
break;
case PRODUCTS_CHANGED: //display visual indicator for products changed
break;
case ADDRESS_CHANGED: //display visual indicator for address changed
break;
}

Я понимаю, что мог сделать:

$visual_indicator = (int)$products_changed * 10 + (int)$address_changed;
//11 will be both changed, 10 will be products changed, 1 will be address changed

Однако я ищу более элегантного и, возможно, родного оператора.
Это важно как для уменьшения избыточности кода, так и для читабельности (это, конечно, упрощенная версия моего кода, поэтому в моем собственном проекте это будет иметь лучшие последствия).

Помогите & идеи будут оценены. Благодарю.

1

Решение

Для таких вещей я использую побитовые операторы. Что-то вроде следующего:

    <?php

// shift each option by 1
define('A', 1);
define('B', 1<<1);
define('C', 1<<2);

// combine opitons with bitwise or (|)
$c = A | C;

// compare with or'ed values to find the combination
switch ($c) {
case A:
print "A only\n";
break;
case A|B:
print "A and B\n";
break;
case A|C:
print "A and C\n";
break;
}

// use bitwise and (&) to check if an option is present
if ($c & A) print "Has A\n";
if ($c & B) print "Has B\n";
if ($c & C) print "Has C\n";
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]