【问题标题】:PHP calculate running sum from array based on date valuePHP根据日期值计算数组的运行总和
【发布时间】:2012-01-15 13:57:20
【问题描述】:

我需要创建一个 PHP 函数,它将遍历一个多维数组并返回一个值,该值表示某个键的总和,其中另一个键的值是

Array
(
[Nov 18, 2011] => Array
    (
        [C] => 100
        [I] => 100
        [M] => 100
    )
[Nov 22, 2011] => Array
    (
        [C] => 200
        [I] => 200
    )
[Nov 29, 2011] => Array
    (
        [C] => 300
        [I] => -300
    )
)

永远不会超过这 3 个类别 [C]、[I] 和 [M],并且每个日期的值应被视为运行总和。

那么,如何计算截至 2011 年 11 月 22 日的 [C] 类别的值?正确的值当然是 300。(11 月 18 日为 100 + 11 月 22 日为 200)

如果我需要计算截至 2011 年 11 月 29 日的 [I] 值怎么办?这个例子中的正确答案是 0。(100 + 200 - 300)

我对如何最好地实现这一目标持开放态度。我的直觉是拥有某种功能,然后传入类别和日期值。谢谢。

【问题讨论】:

  • 为了清楚起见,您是存储总和还是计算总和?您说每个值应该是总和,但您的示例显示了重新计算

标签: php arrays function sum


【解决方案1】:

取决于您可能想要执行此操作的次数,以及您是否需要为每个类别执行此操作等,无论您使用的是函数还是简单的循环。

无论哪种方式,您都可以将以下内容放入函数中,然后传入 $target_date 和类别(替换我在此示例中使用的硬编码“C”):

$c_total = 0;
foreach($main_array as $date => $sub_array)
{
    if($date <= $target_date)
    {
        $c_total += $sub_array["C"];
    }
}

编辑:为清楚起见,这里是使用 strtotime() 将日期值转换为时间戳以便于比较的函数:

function getCategoryTotal($target_date, $category)
{
    $c_total = 0;
    $target_date = strtotime($target_date);
    foreach($main_array as $date => $sub_array)
    {
        if(strtotime($date) <= $target_date)
        {
            $c_total += $sub_array[$category];
        }
    }
    return $c_total;
}

【讨论】:

  • 我在让它工作时遇到了一些麻烦。您的函数版本没有return 语句。那是故意的吗?我需要对日期值做任何事情,例如将它们包装在某些东西中,还是按原样使用?
  • 我已经编辑了答案以包含函数的返回。至于日期值,您可能希望使用 strtotime() 将它们转换为时间戳值,然后可以进行比较
  • 。 . .还刚刚注意到您有$total = 0,然后在foreach 循环中有$c_total += 。我假设这是一个错字,对吧? @theox
  • 再次更新以显示函数中 strtotime() 的使用。只需将日期字符串传递给函数,看起来就像您在数组中一样,即“2011 年 11 月 18 日”,它将被转换为时间戳,就像在比较两者之前数组中的每个日期一样
  • 哎呀,对不起,这是一个错字 - 选择你更喜欢的一个:)
猜你喜欢
  • 2021-12-29
  • 2020-11-14
  • 2015-02-09
  • 1970-01-01
  • 2017-03-25
  • 2020-04-08
  • 2021-05-27
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多