У меня есть 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
Однако я ищу более элегантного и, возможно, родного оператора.
Это важно как для уменьшения избыточности кода, так и для читабельности (это, конечно, упрощенная версия моего кода, поэтому в моем собственном проекте это будет иметь лучшие последствия).
Помогите & идеи будут оценены. Благодарю.
Для таких вещей я использую побитовые операторы. Что-то вроде следующего:
<?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";
Других решений пока нет …