从数组中获得总和

时间:2016-07-14 02:10:57

标签: php arrays multidimensional-array

我有2个数组如下所示。

我需要获得与其相关的每个里程碑的进度总和(在任务数组中)。

所以在tasks数组中,我可以看到1578453e53090b(线框里程碑)的进度总和为15。

理想的结果是将进度总和附加到每个里程碑。希望这是有道理的。

$milestones = 
Array
(
[0] => Array
    (
        [id] => 1578453e53090b
        [milestone] => Wireframe
        [assigned_to] => 9
    )

[1] => Array
    (
        [id] => 1578453e530975
        [milestone] => Development
    )

[2] => Array
    (
        [id] => 1578453e530943
        [milestone] => Design
        [assigned_to] => 2
    )

)


$tasks =
Array
(
[0] => Array
    (
        [id] => 15786dc59333f2
        [status] => Open
        [progress] => 5
        [milestone] => 1578453e53090b
    )

[1] => Array
    (
        [id] => 15786dc669d451
        [status] => Open
        [progress] => 10
        [milestone] => 1578453e53090b
    )

[2] => Array
    (
        [id] => 15786dc7ccbea3
        [status] => Open
        [progress] => 20
        [milestone] => 1578453e530943
    )
)

2 个答案:

答案 0 :(得分:2)

数组映射应该可以解决问题:

//will add 'progress' key to each milestone
$tabulate_progress = function($milestone) use ($tasks) {
    $milestone['progress'] = 0; //start with 0 progress

    foreach($tasks as $task):
        //add to progress if we find a matching task
        if($task['milestone']===$milestone['id'])
            $milestone['progress']+=$task['progress'];
    endforeach;

    return $milestone;
};
$milestones = array_map($tabulate_progress,$milestones);

Here's a demo

答案 1 :(得分:1)

其中一种方法是使用foreach。使用foreach的第一个milestones获取与foreachtasks的第二个milestone匹配的ID。

之后,使用简单的$total容器继续使用,并使用简单的if进行调整。

foreach($milestones as &$m) {
                //     ^ add reference to make changes
    $total = 0; // initialize total holder
    foreach($tasks as $task) {
        if($task['milestone'] === $m['id']) { // if it matches
            $total += $task['progress']; // add
        }
    }

    $m['total'] = $total; // after its done, add another key pair being total and its value
}
相关问题