我看到这段代码相当于数学排列。它会尝试根据$d
的组合设置$a, $b, $c
的值。现在它正在完成3嵌套if / then / else。任何其他方式可以更有效地完成同样的事情吗?
if ($a === true) {
if ($b > 0) {
if ($c === true) {
$d = 6;
} else {
$d = 2;
}
$e = $b;
} else {
if ($c === true) {
$d = 4;
} else {
$d = 0;
}
}
} else {
if ($b > 0) {
if ($c === true) {
$d = 5;
} else {
$d = 1;
}
$e = $b;
} else {
if ($c === true) {
$d = 7;
} else {
$d = 3;
}
}
}
注意
末尾有$e = $b;
if ($a === true) {
if ($b > 0) {
} else {
if ($b > 0) {
我想我会从整个外观中删除它并说出
if ($b > 0) {
$e = $b;
的逻辑错误?
答案 0 :(得分:8)
你可以这样做:
$vals = array(3,7,1,5,0,4,2,6);
$d = $vals[((int)($a === true) << 2) + ((int)($b > 0) << 1) + (int)($c === true)];
if ($b > 0) {
$e = $b;
}
这将每个条件作为3位值中的一位来确定 d 的值的索引:
index = a·2^2 + b·2^1 + c·2^0
每个条件产生一个布尔值,转换为整数(见boolean to integer conversion),然后根据它所代表的位的位置进行移位(参见shift left operator <<
)。
答案 1 :(得分:2)
只需将作业(按顺序)写为:
$d = 0 + 2 + 4
$d = 0 + 2
$d = 0 + 4
$d = 0
$d = 1 + 4
$d = 1
$d = 1 + 2 + 4
$d = 1 + 2
然后你就有了
$d = ($a === true ? 0 : 1) + ($c === true ? 4 : 0) + (($b > 0) === $a ? 2 : 0)
if ($b > 0)
$e = $b
答案 2 :(得分:1)
你可以采用一种完全不同的方法来处理一点标记。
$a == true
$b > 0
$c == true
这将为您提供八个不同的值,您可以轻松地进行计算和比较。
的伪代码:
d = (a ? 1 << 0 : 0)
| (b > 0 ? 1 << 1 : 0)
| (c ? 1 << 2 : 0)
编辑:忘记警告这与您当前的$d
值不符,如果可能的话,您必须重新映射或重做上述内容。只是一个建议。
答案 3 :(得分:1)
<?php
$a = $argv[1] ? true : false;
$b = $argv[2];
$c = $argv[3] ? true : false;
$d = 0;
$e = null;
// compute
if ($b > 0) {
$e = $b;
$b_bool = true;
}
else {
$b_bool = false;
}
if (!$a) $d += 1;
if (!($a ^ $b_bool)) $d += 2;
if ($c) $d += 4;
echo "$d $e\n";
如果您可以稍微重新排列数据,则不需要XOR。
显然,这可以通过单个赋值轻松压缩,但我将其扩展为更具可读性。