2011-12-08 69 views
0

我需要创建一个PHP函数,它将通过多维数组循环并返回一个表示某个键的总和的值,其中另一个键的值为< =传入函数的日期值。下面是数据阵列的样本阵列: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 + 200从11月22日起)

如果我需要计算2011年11月29日的[I]的价值?在这个例子中的正确答案是0.(作为100 + 200 - 300)

我很乐意知道如何最好地实现这一点。我的直觉是有某种功能,然后传入类别和日期值。谢谢。

+0

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

回答

2

取决于您可能需要做多少次,以及是否需要针对每个类别执行此操作,无论您是否使用函数或仅使用简单循环。

无论哪种方式,你可以把下列的功能,只是传递$ 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

真棒,谢谢。让我试试看。 – DanielAttard

+0

我有一些麻烦让它工作。你的函数版本没有'return'语句。那是故意的吗?我是否需要对日期值做任何事情,比如将它们包装在某个东西中,或者按照原样使用? – DanielAttard

+0

我编辑了我的答案,以包含函数的返回值。至于日期值,您可能需要使用strtotime()将它们转换为时间戳值,然后将其与 – TheOx