PHP - 基于键的数组值的总和

时间:2015-11-17 08:12:37

标签: php arrays

下面是按月显示用户数据的数组输出。我需要为不同的资源获得ACTUAL_HOURS的总和。

如下所示,User 1 and User 2个月JUL-2015的ACTUAL_HOURS总和应为10 + 20 = 30。 同样适用于AUG-2015 80 + 20 = 100

$user_array输出

Array
(
    [User 1] => Array
        (
            [JUL-2015] => Array
                (
                    [SITE_STATUS] => Offshore
                    [ACTUAL_HOURS] => 10
                    [PROJECTED_HOURS] => 20
                )

            [AUG-2015] => Array
                (
                    [SITE_STATUS] => Offshore
                    [ACTUAL_HOURS] => 80
                    [PROJECTED_HOURS] => 88
                )

        )

    [User 2] => Array
        (
            [JUL-2015] => Array
                (
                    [SITE_STATUS] => Offshore
                    [ACTUAL_HOURS] => 20
                    [PROJECTED_HOURS] => 0
                )

            [AUG-2015] => Array
                (
                    [SITE_STATUS] => Offshore
                    [ACTUAL_HOURS] => 20 
                    [PROJECTED_HOURS] => 0
                )

        )
)

$project_months输出

Array
(
    [0] => JUL-2015
    [1] => AUG-2015
)

循环下面的数据给出了总和,但不是User 1

foreach ($user_array as $user_name => $user_data) {

    foreach ($project_months as $month) {
   }
}

如上所示,如何针对不同资源月份显示ACTUAL_HOURSPROJECTED_HOURS的总和?

2 个答案:

答案 0 :(得分:0)

你做错了。不需要两个嵌套的foreach循环。你只需要一个for循环来循环遍历项目月和一个foreach循环来循环遍历用户数组。

你没有在php代码中共享数组,但我认为你的数组如下:

$array  = array(
    'User 1' => array(
        'JUL-2015' => array(
                'SITES_STATUS' => 'Offshore',
                'ACTUAL_HOURS' => 10,
                'PROJECTED_HOURS' => 20
            ),
        'AUG-2015' => array(
                'SITES_STATUS' => 'Offshore',
                'ACTUAL_HOURS' => 80,
                'PROJECTED_HOURS' => 88
            ),

        ),
    'User 2' => array(
        'JUL-2015' => array(
                'SITES_STATUS' => 'Offshore',
                'ACTUAL_HOURS' => 20,
                'PROJECTED_HOURS' => 0
            ),
        'AUG-2015' => array(
                'SITES_STATUS' => 'Offshore',
                'ACTUAL_HOURS' => 20,
                'PROJECTED_HOURS' => 0
            ),

        ),
);

以下几个月:

$project_months = array('JUL-2015', 'AUG-2015');

现在计算每个月所有用户的总实际小时数,您将需要如下所示的循环:

for ($i=0; $i < count($project_months); $i++) { 
    $totalActualHours = 0;
    foreach($array AS $ar) {
        $totalActualHours += $ar[$project_months[$i]]['ACTUAL_HOURS'];
    }
    echo $project_months[$i].': '.$totalActualHours.'<br>';     
}

运行ACTUAL_HOURS时此代码的输出:

JUL-2015: 30
AUG-2015: 100

希望这会有所帮助。

答案 1 :(得分:0)

你可以简单地使用两个foreach循环。

$hoursInMonth = array();
foreach ($users as $user)
{
    foreach ($user as $month => $userData) {
        $hoursInMonth[$month] += $userData['ACTUAL_HOURS'];
    }
}

考虑到$users变量是问题中的数组,会产生以下结果:

Array
(
    [JUL-2015] => 30
    [AUG-2015] => 100
)

您可以将其包装在一个函数中,这样您就可以轻松地在所需的索引之间切换。

/**
 * @param array $inputArray The input array
 * @param string $typeOfHours The desired index
 * @return array
 */
function calculateHoursInMonths(array $inputArray, $typeOfHours)
{
    $hoursInMonth = array();

    foreach ($inputArray as $user)
    {
        foreach ($user as $month => $userData) {
            $hoursInMonth[$month] += $userData[$typeOfHours];
        }
    }

    return $hoursInMonth;
}

请注意,这不考虑离岸/陆上状态。您可以通过添加简单的if来添加它。