PHP 根据日期值计算数组的运行总和

问题描述 投票:0回答:2

我需要创建一个 PHP 函数,它将循环遍历多维数组并返回一个表示某个键之和的值,其中另一个键的值是 <= the date value passed into the function. Here is a sample array of the data array:

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
2个回答
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;
}

0
投票

尚不清楚您的“截至”日期是否可能出现在数组中的日期/键之间。 假设您的搜索词将与您的数组键对齐,只需在遇到截至日期时有条件地中断循环即可。 演示

$column = 'I';
$asOfDate = 'Nov 29, 2011';

$amount = 0;
foreach ($array as $date => $row) {
    $amount += $row[$column] ?? 0;
    if ($date === $asOfDate) {
        break;
    }
}
var_export($amount);
© www.soinside.com 2019 - 2024. All rights reserved.