2011-12-07 25 views
2

我試圖編寫一個函數來計算每個訂單的總價格,當給出產品的價格和該用戶的信用額度時。信用應該扣除,如果還有剩餘,應該從下一個訂單中扣除。在一個數組中的PHP計算(遞歸?)

函數應該返回每個訂單的最終價格以及單個數組中每個帳戶的每個帳戶的最終價格,其中客戶ID爲關鍵字。任何負數(信用或訂單價格)都應設爲0.

'abc'和'def'是客戶ID。這個示例代碼應該解釋得更好。 我需要遞歸函數嗎?

輸入:

//should return: order 1 = 375, order 2 = 90, remaining credit = 0; 
$order['abc'][1] = 500; 
$order['abc'][2] = 90; 
$credit['abc'] = 125; 

//should return: order 1: 0, order 2: 0, remaining credit = 125 
$order['def'][1] = 100; 
$order['def'][2] = 75; 
$credits['def'] = 300; 

回報應該是一個單一的陣列,因爲這樣的:

$set['abc'][1] = 375; 
$set['abc'][2] = 90; 
$set['abc']['credit_remaining'] = 0; 
$set['def'][1] = 0; 
$set['def'][2] = 0; 
$set['def']['credit_remaining'] = 125; 
+1

代碼在哪裏?你到底有什麼麻煩?不,您不需要遞歸,因爲您沒有做任何涉及將自己作爲解決方案的一部分的任何事情。你也不需要知道任何關於不同客戶的代碼,只需要一個'function order_results($ orders,$ credit)'。 – Jon

+0

Jon,根據問題中的示例和規範,客戶ID是必需的,否則您將無法將任何價值與特定客戶相關聯。 Stef,我對這個功能的目的有點困惑,因爲要求似乎更多地是報告而不是實際的財務功能?如果我們知道這一點,我們可以提供更多的見解和更好的迴應。 – Ryan

回答

0

無需遞歸,爲什麼不嘗試這樣的事情?

$newArray = array(); 

foreach ($order as $customer => $value) 
{ 
    $newArray[$customer]['credit_remaining'] = $credit[$customer]; 

    foreach ($order[$customer] as $order_num => $cost) 
    { 
     //Order is more than credit 
     if($newArray[$customer]['credit_remaining'] - $order[$customer][order_num] <= 0) 
     { 
      $newArray[$customer][$order_num] = $order[$customer][$order_num] - newArray[$customer]['credit_remaining']; 
      $newArray[$customer]['credit_remaining'] = 0; 
     } 

     //Otherwise 
     else 
     { 
      $newArray[$customer]['credit_remaining'] -= $order[$customer][$order_num]; 
      $newArray[$customer][$order_num] = 0; 
     } 
    } 
} 
+1

你可能是指第5行的$ newArray [] ...'。我爲你修復了這個問題:) –

+0

doh!謝謝 :)。 – SuperTron

0

不必是遞歸的。這應該工作:

function someFunction($order, $credit) { 
    $set = NULL; 
    $keys = array_keys($order); 
    foreach ($keys as $key) { 
     $set[$key]['credit_remaining'] = $credit[$key]; 

     // assuming that the orders are numerically contiguous 
     for ($counter = 1; $counter < count($order[$key]); $counter++) { 
      if ($order[$key][$counter] < $set[$key]['credit_remaining']) { 
       // then the order is less than the credit 
       $set[$key]['credit_remaining'] -= $order[$key][$counter]; 
       $set[$key][$counter] = 0; 
      } else { 
       // not enough credit to cover this order 
       $set[$key][$counter] -= $set[$key]['credit_remaining']; 
       $set[$key]['credit_remaining'] = 0; 
      } 
     } 
    } 

    return $set; 
} 
0
//should return: order 1 = 375, order 2 = 90, remaining credit = 0; 
    $order['abc'][1] = 375; // assuming you meant 375 per your comment above 
    $order['abc'][2] = 90; 
    $credits['abc'] = 125; // assuming you meant $credits in the posted code 

    //should return: order 1: 0, order 2: 0, remaining credit = 125 
    $order['def'][1] = 100; 
    $order['def'][2] = 75; 
    $credits['def'] = 300; 


    $set = array(); 
    foreach($order as $key=>$value){ 
      foreach($value as $single_order){ 
        $set[$key][] = $single_order; 
        !isset($set[$key]['credit_remaining']) ? $set[$key]['credit_remaining'] = max(0,$credits[$key] - $single_order) : $set[$key]['credit_remaining'] = max(0,$set[$key]['credit_remaining'] - $single_order); 
      } 
      ksort($set[$key],SORT_STRING); // sort the array so the credits are last 
    } 

    print_r($set); 

    /* 
    Array 
    (
     [abc] => Array 
      (
       [0] => 375 
       [1] => 90 
       [credit_remaining] => 0 
      ) 

     [def] => Array 
      (
       [0] => 100 
       [1] => 75 
       [credit_remaining] => 125 
      ) 

    ) 
    */