【问题标题】:PHP Loop calculations, get previous value and add currentPHP循环计算,获取先前值并添加当前值
【发布时间】:2017-12-05 15:49:56
【问题描述】:

我正在尝试获取当前循环的先前值以进行某些计算。 作为起点,让我们描述一下代码的作用。

  • 外循环生成月份名称
  • $forecast_correction 是用于更正某些值的循环

我们的想法是对月份进行预测/预测,具有月份的基本成本和默认百分比。

这是循环的逻辑。一月是开始月份,我们在那里设置基数$price,但下个月(二月)应该是一月*$default_percent, 三月应该是二月 * $default_percent 等都应该包括更正。

当涉及到更正时,我们得到了两个变量

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

Percentage 可以改变,如果外循环月($m) 等于修正数组 $month,否则它的默认值。 Month cost 是一个基本的计算。

  +----------+---------------+------------+------------+------------+------------+-------------+-------------+-------------+-------------+------------+------------+
  |   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 |
  +----------+---------------+------------+------------+------------+------------+-------------+-------------+-------------+-------------+------------+------------+

代码sn-p


<?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

如果您需要进一步澄清,请不要犹豫,我非常坚持这一点。

MCVE 沙盒


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

【问题讨论】:

    标签: php


    【解决方案1】:

    我认为只需稍加修改,您的示例代码就可以满足您的需求。

    我将 $price 重命名为 $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. 您可以将一月添加到 $forecast_correction 数组中,“百分比”值为 1(因此初始 $base_month_cost 乘以 1,并且保持不变)。
    2. 您可以在 for 循环中添加一些额外的逻辑,如果 $m == 1 将 $percentage 设置为 1,或者如果 $m == 1 忽略 $percentage,则对 $month_cost 进行不同的计算。李>

    我认为第一种方法更干净。

    希望这是您正在寻找的。当我用我的修改运行它进行测试时,我注意到在您的示例中,四月的百分比值为 0.15,这显着降低了该(以及连续几个月)的 $month_cost。

    【讨论】:

    • 看起来是合理的数字,会检查更多
    • 需要说明的一点:第一个月应该是base_month_cost +更正,百分比不适用于第一个循环。其他一切似乎都很好
    • 是的,我应该发现一月份的百分比问题。我已经用几种方法更新了我的答案来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多