Sum数组值取决于日期非奇点

时间:2013-06-02 20:55:03

标签: php arrays sum

假设我有2个相同大小的数组填充了值。日期数组包含字符串格式的日期,而成本数组包含数字成本。 例如:

$dates = array('2001-01-01', '2001-02-01', '2001-02-01', '2001-02-01', '2001-03-01', '2001-04-01', '2001-04-01', '2001-05-01');
$costs = array(5, 10, 20, 4, 30, 14, 2, 0);

我想要的是只有当$ dates数组中的日期重复时才将数字数组中的数字加到一个新数组中。发生这种情况时,新数组值必须是其“左兄弟”的总和。其余的新数组值应为0.在其他情况下(当数组中的日期唯一时,则新数组值为0)。

这应该是上述过程的结果:

$newarr = array(5, 0, 0, 34, 30, 0, 16, 0);

1 个答案:

答案 0 :(得分:3)

这个怎么样?

$result = $costs;
foreach ($dates as $i => $d) {
    if ($i > 0 && $dates[$i - 1] == $dates[$i]) {
        $result[$i] += $result[$i - 1];
        $result[$i - 1] = 0;
    }
}
print_r($result);

我们从$costs数组开始,循环遍历所有日期...每当我们检测到日期与上一个条目相同时,我们将前一个条目归零并添加它的值到我们当前的位置。

替代解决方案

这不完全是你所要求的,但我怀疑一个更有用的解决方案可能是这个:

$result = array();
foreach ($dates as $i => $d) {
    $result[$d] = (isset($result[$d]) ? $result[$d] : 0) + $costs[$i];
}
print_r($result);

这将产生以下结果:

array(
    '2001-01-01' => 5,
    '2001-02-01' => 34,
    '2001-03-01' => 30,
    '2001-04-01' => 16,
    '2001-05-01' => 0
)