2011-06-05 44 views
2

我看到這個代碼爲數學置換的等價物。它試圖設置的$d基礎上,$a, $b, $c組合的價值。現在它正在使用3嵌套if/then/else。任何其他方式可以更有效地完成同樣的事情?除去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; 
     } 
    } 
} 

通知那裏的

if ($a === true) { 
    if ($b > 0) { 
} else { 
    if ($b > 0) { 

末的$e = $b;我想我會只與邏輯$e = $b;刪除了整個妝容的說

if ($b > 0) { 

任何錯誤?

+3

有點偏離主題(和潛在的不相關),但你一定要明白,你是允許在PHP中使用有意義的變量名稱? (Fortran的是* *等很久以前。):-) – 2011-06-05 18:08:05

+1

@middaparka,它只是一個排列,所以的'$組合,$ B,$ C'。我認爲在這種情況下,比給他們名字更簡單。我不會爲真正的軟件做'$ a,$ b,$ c' :) – switch 2011-06-05 18:10:35

+0

想到的一樣 - 只是檢查。 :-) – 2011-06-05 18:12:36

回答

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 <<)的布爾值。

+0

哇!太「硬編碼」,但真棒:) – 2011-06-05 18:12:04

+0

@Gumbo,我相信這是非常好的,但我不知道它是什麼意思。 – switch 2011-06-05 18:19:35

+0

@switch:我添加了一個解釋。 – Gumbo 2011-06-05 18:22:33

1

你可能需要用一個比特的標誌的東西完全不同的方法。

  • 位0:1如果$a == true
  • 位1:1,如果$b > 0
  • 位2:1,如果$c == true

這會給你八個不同的值,可以計算和比較容易。

僞代碼:

d = (a  ? 1 << 0 : 0) 
    | (b > 0 ? 1 << 1 : 0) 
    | (c  ? 1 << 2 : 0) 

編輯:忘了警告,這將不匹配您當前的$d值,你必須重新映射或返工上面如果可能的話。只是一個建議。

+0

處理位時,應該使用'|'而不是'+'。 – ThiefMaster 2011-06-05 18:10:52

+0

好點。硬編碼1,2和4都不是很好 – Mat 2011-06-05 18:26:55

+0

我同意建議使用適當的位字段。如果每個條件都代表一個位,那將會更有意義。 – Matthew 2011-06-05 18:34:57

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。

而且很明顯,這可能是易板結有點用一個單一的任務,但我把它擴展到更具可讀性。

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 
+0

+1有趣的解決方案。 – Gumbo 2011-06-05 19:55:46