首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于键的数组值和

基于键的数组值和
EN

Stack Overflow用户
提问于 2015-11-17 08:12:37
回答 2查看 129关注 0票数 0

下面是数组输出,它显示用户数据,按月显示。我需要得到不同资源的ACTUAL_HOURS之和。

对于下面的ACTUAL_HOURS,User 1 and User 2JUL-2015月份的和,应该是10 + 20 = 30AUG-2015也是如此,它是80 + 20 = 100

$user_array输出

代码语言:javascript
复制
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输出

代码语言:javascript
复制
Array
(
    [0] => JUL-2015
    [1] => AUG-2015
)

循环如下所示的数据给出了求和,但对于User 1不是这样。

代码语言:javascript
复制
foreach ($user_array as $user_name => $user_data) {

    foreach ($project_months as $month) {
   }
}

如何显示不同资源月份的ACTUAL_HOURSPROJECTED_HOURS之和,如上面所示?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-17 08:44:40

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

代码语言:javascript
复制
$hoursInMonth = array();
foreach ($users as $user)
{
    foreach ($user as $month => $userData) {
        $hoursInMonth[$month] += $userData['ACTUAL_HOURS'];
    }
}

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

代码语言:javascript
复制
Array
(
    [JUL-2015] => 30
    [AUG-2015] => 100
)

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

代码语言:javascript
复制
/**
 * @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来添加它。

票数 0
EN

Stack Overflow用户

发布于 2015-11-17 08:41:45

你做错了。不需要两个嵌套的foreach循环。您只需要一个for循环循环到一个项目月循环,一个foreach循环循环到用户数组。

您没有在php代码中共享数组,但我假设您是数组,如下所示:

代码语言:javascript
复制
$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
            ),

        ),
);

月份如下:

代码语言:javascript
复制
$project_months = array('JUL-2015', 'AUG-2015');

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

代码语言:javascript
复制
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运行此代码时的输出:

代码语言:javascript
复制
JUL-2015: 30
AUG-2015: 100

希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33751995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档