繁体   English   中英

PHP-基于键的数组值总和

[英]PHP - Sum of array values based on key

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

对于以下情况, User 1 and User 2JUL-2015月的ACTUAL_HOURS之User 1 and User 2应为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对于不同的资源月份明智如上图所示?

你做错了。 不需要两个嵌套的foreach循环。 您只需要一个for循环来遍历项目月份,一个foreach循环来遍历users数组。

您没有在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

希望这会有所帮助。

您可以简单地使用两个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来添加它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM