2013-10-02 177 views
0

我希望這是有道理的。現在,我正在使用以下代碼來添加多個複選框,並根據該數字獲取運費價格。這隻會讓我有一個航運價格(地面)。我知道想要添加多個運輸選項,因此我需要添加另一組開關/案例語句。如果語句選擇開關語句

//Add up club totals for shipping 
      $clubTotal = array(
          $driversChecked, 
          $hybridsChecked, 
          $woodsChecked, 
          $boxesChecked, 
          $wedgesChecked, 
          ); 

      //see what shipping was picked 
      $shippingChoice = $_POST['ShipMethod']; 

      //Figure out ground shipping 
      if (array_sum($clubTotal)) 
      { 
       switch(array_sum($clubTotal)) 
       { 
        case 6: 
         $shippingCost = 15.99 ; 
         break ; 

        case 7: 
        case 8: 
         $shippingCost = 16.99 ; 
         break ; 

        case 9: 
        case 10: 
         $shippingCost = 17.99 ; 
         break ; 

        case 11: 
        case 12: 
         $shippingCost = 18.99 ; 
         break ; 

        case 13: 
         $shippingCost = 19.99 ; 
        break ; 

        case 14: 
         $shippingCost = 20.99 ; 
        break ; 

        case 15: 
         $shippingCost = 21.99 ; 
        break ; 

        case 16: 
         $shippingCost = 22.99; 
        break ; 

        default: 
         $shippingCost = 14.99; 
         break ; 
       } 
      } 

如果$shippingChoice = $_POST['ShipMethod'];越來越我的船的方法,我怎麼可以用它來選擇要使用的開關/ case語句。就像$shippingChoice返回「ground」的值一樣,它會使用我當前的switch/case語句。如果它返回「2 Day」,它會使用我將創建的另一個switch/case語句。

+1

我沒有看到這個switch語句的一個要點。爲什麼這些運輸成本值不會出現在stdClass中,您可以根據基於您的結構的數組鍵來引用該值,這個值就像1-16那樣? – Ohgodwhy

回答

1

你想要這樣的嗎?爲其他運輸方式添加一個子陣列。

$shippingCostData = array(
    'ground' => array(
     6 => 15.99, 
     7 => 16.99, 
     8 => 16.99, 
     9 => 17.99, 
     10 => 17.99, 
     11 => 18.99, 
     12 => 18.99, 
     13 => 19.99, 
     14 => 20.99, 
     15 => 21.99, 
     16 => 22.99, 
     'default' => 14.99, 
    ), 
); 

$method = 'ground'; 
$clubTotalSum = array_sum($clubTotal); 
$shippingCost = (isset($shippingCostData[$method][$clubTotalSum]) ? $shippingCostData[$method][$clubTotalSum] : $shippingCostData[$method]['default']); 

您還可以使用類似的東西來過濾運輸方式以確保它是有效的。

$method = (isset($shippingCostData[$_POST['shippingMethod']]) ? $_POST['shippingMethod'] : key($shippingCostData)); 
+0

我不喜歡這種方法,您必須確保您已經將費用數組填入最大可能的總和,否則代碼將工作但執行錯誤的操作(返回「默認」值)。 – Jon

+0

@Jon,但它很容易理解,使用簡單。吻。 – OIS

+0

KISS不是招惹錯誤的藉口,特別是在涉及金錢方面。很容易適應這種情況,這樣就不會有這樣的問題發生,IMO應該這樣做。 – Jon

1

您應該定義另一種在運行時更具延展性的運輸費用。例如:

$costs = [ 
    1 => 14.99, // 1 or more = 14.99 
    6 => 15.99, // 6 or more 
    7 => 16.99, 
    9 => 17.99, 
]; 

然後,您可以編寫一個函數,它的數量和成本數組,並返回成本:

function calculateCost($items, $costs) { 
    ksort($costs); // just to be on the safe side 
    $result = reset($costs); 
    foreach($costs as $number => $cost) { 
     if ($number > $items) break; 
     $result = $cost; 
    } 

    return $result; 
} 

你這樣做了之後,很容易讓多個成本陣列和轉發給你需要的人,例如

$costs = [ 
    'ground' => [ 
     1 => 14.99, 
     6 => 15.99, 
    ], 
    'air' => [ 
     1 => 24.99, 
     6 => 25.99, 
    ], 
]; 

$shippingChoice = $_POST['ShipMethod']; 
$cost = calculateCost(array_sum($clubTotal), $costs[$shippingChoice]); 

您可以輕鬆地將其擴展到任意數量的運輸方式。

+0

我試過這段代碼,它似乎正在破壞。我想我唯一不瞭解的部分是'函數'。我應該定義'$ items'是否等於勾選的複選框數量? – Packy

+0

@Packy:基本上無論'array_sum($ clubTotal)'是什麼。 「項目」是我對它的解釋。 – Jon

+0

這就是我認爲和我定義的項目,但仍然打破。現在我有'$ costs'數組,'$ shippingChoice','$ cost',然後是'function'。這是正確的順序嗎?我不確定函數的'$ number'部分。 – Packy