2017-12-05 10 views
2

いくつかの計算では、現在のループの前の値を取得しようとしています。 出発点として、コードの内容を説明します。PHPループ計算で前の値を取得して現在を追加する

  • 外部ループは
  • $ forecast_correctionは、いくつかの値

アイデアがための基本コストとデフォルト率を持つか月間の予測/予測を行うことであるを補正するためのループである月の名前を生成し、月。

これはループのロジックです。 1月が始まる月、我々はその基盤を$priceに設定しますが、来月(2月)は1月* $default_percent、 月は2月* $default_percentなどにすべて修正が含まれるはずです。

それは我々が外部ループ月($ mは)他の補正配列$月、デフォルト値に等しい場合に二つの変数

$percentage = (!empty($modified_percentage)) ? $modified_percentage : $default_percent; 
$month_cost = $price * $percentage + $correction_cost; 

Percentageを変更することができました修正になります。 Month costは基本的な計算です。持っているために、この特定の例では、2月= 1月*パーセントロジックを実装する方法:

+----------+---------------+------------+------------+------------+------------+-------------+-------------+-------------+-------------+------------+------------+ 
    | jan |  feb  | mar  | apr  | may  | june | july  | augu  | sept  |  oct  | nov  | dece | 
    +----------+---------------+------------+------------+------------+------------+-------------+-------------+-------------+-------------+------------+------------+ 
    | 41290.65 | 41290.65*1.03 | feb * 1.03 | mar * 1.03 | apr * 1.03 | may * 1.03 | june * 1.03 | july * 1.03 | augu * 1.03 | sept * 1.03 | oct * 1.03 | nov * 1.03 | 
    +----------+---------------+------------+------------+------------+------------+-------------+-------------+-------------+-------------+------------+------------+ 

コードは、質問


<?PHP 
$forecast_correction = array(
    array(
     'month' => '2', 
     'add' => 150.00, 
     'substract' => 0.00, 
     'final' => 150.00, 
     'percent' => 1.02 
    ), 
    array(
     'month' => '3', 
     'add' => 0.00, 
     'substract' => 250.00, 
     'final' => -250.00, 
     'percent' => NULL 
    ), 
    array(
     'month' => '4', 
     'add' => 0.00, 
     'substract' => 0.00, 
     'final' => 0.00, 
     'percent' => 0.15 
    ) 
); 
$price    = 41290.65; 
$default_percent  = 1.03; 

for ($m = 1; $m <= 12; ++$m) { 
    $correction_cost  = 0; 
    $modified_percentage = null; 
    foreach ($forecast_correction as $correction) { 

     if ($m == $correction['month']) { 
      $correction_cost = $correction['final']; 
      if (!empty($correction['percent'])) { 
       $modified_percentage = $correction['percent']; 
      } 
     } 
    } 
    ; 
    $percentage = (!empty($modified_percentage)) ? $modified_percentage : $default_percent; 
    $month_cost = $price * $percentage + $correction_cost; 

    echo date('F', mktime(0, 0, 0, $m, 1)) . " :: $month_cost :: " . $correction_cost . " :: " . $percentage . "% \n"; 
} 

質問と所望の出力


をスニペット補正アレイで適切に計算されたすべての結果。

所望の出力(プレーンテキストことができ、アレイの何でも。)

Month : Cost 

あなたは、将来の明確化が必要な場合は、私はこの1つとはかなりこだわっています、お気軽にお問い合わせください。

MCVEサンドボックス


http://sandbox.onlinephpfunctions.com/code/0c705ab721c6160813b98d133d8a1b7ff876cdca

答えて

2

私は、軽微な変更のカップルとあなたのサンプルコードは、あなたがやりたいと思います。

私はそれが最初に定義されている場所base_month_cost $に$価格と改名:

$base_month_cost  = 41290.65; 

、外側のループでの$ month_costを計算するのに使用された場合:

$month_cost = $base_month_cost * $percentage + $correction_cost; 

その後、後ライン(上)$ month_costを計算し、私は$のbase_month_costを再定義するために新しい行を追加しました:

$base_month_cost = $month_cost;// set here for use in next iteration 

これは、各月の$ month_costが前月の$ month_costに基づいていることを意味します。

また、1月の$ month_costを計算するときに、パーセント値の増加が適用されないようにする必要があります。

  1. あなたは1の「パーセント」値で$ forecast_correction配列に1月を追加することができます(その初期の$ base_month_costは1を掛けますと、変更されません):私はこの問題に二つのアプローチを考えることができます。
  2. $ m == 1の場合は$ percentageを1に設定し、$ m == 1の場合は$ percentageを無視して$ month_costの別の計算を行うように、forループ内にロジックを追加できます。

私は最初のアプローチがよりクリーンだと思います。

お探しのとおりです。私が修正を加えてテストを実行したとき、4月のパーセント値はあなたの例で0.15であることに気付きました。これは、その月の$ month_costを大幅に削減します。

+0

妥当な数字のように思えますが、もう少しチェックします –

+0

1つのことmetion:最初の月はbase_month_cost +補正でなければなりません。パーセントは最初のループには適用されません。他のすべてはokと思われる –

+0

はい、私は1月のパーセントの問題を見つけたはずです。私はこれを解決するためのいくつかの方法で私の答えを更新しました。 – Clydog

関連する問題