2014-12-04 41 views
0

這裏是我的代碼來檢查兩個元素的可能條件的數量,有沒有辦法減少檢查條件的數量(沒有任何特定的檢查規則)。減少所有可能性的條件數

爲什麼我問的是,我擔心如果我添加一個額外的元素,它將以最大限度地最大化檢查條件。

我該怎麼做?

這裏是我的代碼:

<?php 
$A = 'alpha'; 
$B = 'beta'; 

$result = ''; 

if($A != '' && $B !='') 
{ 
    $result .= 'Both has Value'; 
    // both contains value 
} 
elseif($A != '' && $B =='') 
{ 
    $result .= 'Only A'; 
    // only a contains value 
} 
elseif($A == '' && $B !='') 
{ 
    $result .= 'Only A'; 
    // only b contains value 
} 
else 
{ 
    $result .= 'Both are Empty'; 
    // both contains no value 
} 

echo $A.' - '.$B.'<br>'; 
echo $result; 
?> 

回答

2

嘗試......

<?php 

$a="123"; 
$b=""; 
$c="33"; 
$result=""; 
if($a !="") 
{ 
if($result=="") 
{ 
$result .="a"; //Get value $a only 
} else { 

$result .=" and a"; //Get value $a with $b or $c  
} 
} 
if($b !="") 
{ 
if($result=="") 
{ 
$result .="b"; //Get value $b only 
} else { 

$result .=" and b"; //Get value $b with $a or $c  
} 
} 
if($c !="") 
{ 
if($result=="") 
{ 
$result .="c"; //Get value $c only 
} else { 

$result .=" and c"; //Get value $c with $b or $a 
} 
} 
echo $result; 
?> 
1

這個怎麼樣?我剛剛刪除了多餘的檢查。

if($A && $B) 
{ 
    $result .= 'Both has Value'; 
    // both contains no value 
} 
elseif($A) 
{ 
    $result .= 'Only A'; 
    // only a contains value 
} 
elseif($B) 
{ 
    $result .= 'Only B'; 
    // only b contains value 
} 
else 
{ 
    $result .= 'Both are Empty'; 
    // both contains value 
} 

echo $A.' - '.$B.'<br>'; 
echo $result; 
+0

感謝您減少檢查的條件 – ABD 2014-12-04 09:52:39

+0

還是會增加的病例數顯着增加更多的變量時。 – DanR 2014-12-04 09:53:36

+0

是的,但如果我增加元素的數量,是否有辦法減少這種情況? – ABD 2014-12-04 09:55:22

1

在結果中使用布爾標誌。在這種情況下,位0(0或1)表示A是否爲空,位2(0或2)表示B爲空。

$flags = 0; 
if ($A != '') 
    $flags |= 1; // Binary 0001 = 1 
if ($B != '') 
    $flags |= 2; // Binary 0010 = 2 
$rMsg = array ("Both empty", // 0 : 0000 
       "A only",  // 1 : 0001 
       "B only",  // 2 : 0010 
       "Both full"); // 3 : 0011 

$result .= $rMsg [$flags]; 

我想你是在尋找一個有用的委託人而不是確切的細節。這是你想到的嗎?

更一般地,給定項目的數組(高達取決於MAX_INT 32或64):

$flags = 0; 
for ($i = 0; $i < count ($items); $i++) 
    if ($items [$i] != '') 
     $flags |= 1<<$i; 
// Flags start at bit 0 
// To check if items 3, 7 and 10 are all filled: 
$check = (1<<3)|(1<<7)|(1<<10); 
if ($flags & $check == $check) 
    echo "all set!"; 
// To check if items 0, 5 and 8 are all empty: 
    $check = (1<<0)|(1<<5)|(1<<8); 
if ($flags & ~$check == 0) 
    echo "all clear!"; 
+0

不錯的思維方式我會一直在使用班次,所以他可以添加2個以上的參數。 '$ flags << 1' – DanR 2014-12-04 09:54:48

+1

我想讓第一個易於理解。現在增加了更強大的示例。 – Mike 2014-12-04 10:05:31

0

檢查這個方案,其中我創建僅針對此question.Here把你的變量在陣列中。你可以採取任何不行。的元素。

$array = array('alpha','beta','theta','gamma'); 
$result = array(); 
$final = ''; 
foreach($array as $key=>$value) 
{ 
    if($value != '') 
    { 
     array_push($result,$value); 
     if(sizeof($result) == 1) 
      $final .= $value; 
      else 
     $final .= ','.$value; 
    } 
} 
if(sizeof($result) == 0) 
    echo "All are Empty"; 

elseif(sizeof($result) == sizeof($array)) 
    echo "All are Value"; 

else{ 
    echo "Only ".$final; 
} 
1

在一個更抽象的方式,這種有用的小功能:

function partition($ary, $predicate) { 
    $result = [[], []]; 
    foreach($ary as $item) 
     $result[$predicate($item) ? 1 : 0] []= $item; 
    return $result; 
} 

分割的陣列分成兩個部分基於一些標準,給定爲布爾函數。適用於您的具體問題:

$data = array('a', 'b', 'c', ''); 

list($bad, $good) = partition($data, 'boolval'); 

if(!$good) 
    echo 'all are falsy'; 
elseif(!$bad) 
    echo 'all are truthy'; 
else { 
    echo 'bad items: '; print_r($bad); 
    echo 'good items: '; print_r($good); 
} 
+0

這是棘手的,太棒了! – ABD 2014-12-04 12:24:06