2015-11-17 48 views
0

下面是顯示月份用戶數據的數組輸出。我需要爲不同的資源獲得ACTUAL_HOURS的總和。PHP - 基於密鑰的數組值的總和

對於以下情況,月的User 1 and User 2的ACTUAL_HOURS之和應爲10 + 20 = 30。 也是一樣AUG-201580 + 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對不同資源月份的總和?如上所示?

+0

你爲什麼不用db計算所有這些? (如果你保留db的數據當然。) – Alex

回答

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

+0

這是計算'JUL-2015',離岸/現場有多少實際或計劃的小時數,即差異現場和離岸時間? – Slimshadddyyy

+0

@Slimshadddyyy我增加了更多的代碼和輸出給你看。 –

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>';  
} 

此代碼的輸出爲r un for ACTUAL_HOURS

JUL-2015: 30 
AUG-2015: 100 

希望這會有所幫助。