我有 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";