删除3个嵌套的if-then-else

时间:2011-06-05 18:04:14

标签: php

我看到这段代码相当于数学排列。它会尝试根据$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;的逻辑错误?

4 个答案:

答案 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
  • ,则位0:1
  • 如果$b > 0
  • ,则位1:1
  • 如果$c == true
  • ,则位2:1

这将为您提供八个不同的值,您可以轻松地进行计算和比较。

的伪代码:

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。

显然,这可以通过单个赋值轻松压缩,但我将其扩展为更具可读性。