2010-01-09 72 views
2
$arr = $results->row(); 
$score = 0; 
foreach ($arr as &$i) { 
    switch($i){ 
     case ($i <= 4 AND $i >= 1): 
      $score += 1; 
      break; 
     case ($i < 8 AND $i > 4): 
      $score += 3; 
      break; 
     case ($i >= 8): 
      $score += .5; 
      break; 
    } 
} 
    echo $score 

這是我當前的代碼,總計基於約30分貝(SQL)條目的值。有點像分級ruberik。 我需要幫助改善上述代碼。有一個更好的方法嗎?PHP測試評分邏輯和改進?

另外。其中一些(即3,5,8行需要以不同方式評分)。我如何在邏輯中忽略這些行,並讓它們得分不同?

這是一個codeigniter函數,所以如果有人能夠向我展示一個簡單快捷的方法來做到這一點,我會很喜歡它!非常感謝!

回答

1

可以做一些小的改進,但沒有太大的改進。

  • 只需用的if/else代替開關殼體可以稍微提高速度。
  • 確定哪些情況最經常發生並將其放在第一位,因爲這樣可以減少每次迭代需要點擊的案例數量。
  • 建立你想跳過一個簡單isset調用,而不是檢查每一種情況下(多如果將需要/ else語句)
  • 跟蹤迭代次數爲跳過這些行
  • 任何迭代的數組

$skip_iterations = array(3 => 1, 5 => 1, 8 => 1); 
$arr = $results->row(); 
$score = 0; 
$i = 1; 
foreach ($arr as &$a) { 
    // skip rows 3, 5, and 8 
    if (isset($skip_iterations[$i++])) 
     continue; 
    if ($a >= 1 && $a <= 4) { 
     $score += 1; 
    } else if ($a > 4 && $a < 8) { 
     $score += 3; 
    } else if ($a > 8) { 
     $score += .5; 
    } 
} 
echo $score; 
+0

這看起來很不錯。如果我想創建4個案例(不同的評分方法),我將如何切換這些情況? – 2010-01-10 00:50:03

+0

你只是想添加另一個'else if'子句,並且順序取決於你。根據用戶通常選擇的答案,簡單地按照頻率遞減的順序放置它們。 – 2010-01-10 12:55:05

+0

我認爲我們沒有溝通...... 我的意思是,如果我想要多種評分方法,我該怎麼做? 即。我想以單方得分2,4,5,6,20,3,7,9另一種方式,並跳過1,10? – 2010-01-10 15:35:45