2016-04-06 161 views
2

我有以下輸入:總和多維數組元素的

$data = array(
    0 => array(
     'date' => '2014-01-01', 
     'sales' => 1, 
     'price' => array(
      'usd' => 1, 
      'eur' => 100 
     ) 
    ), 
    1 => array(
     'date' => '2014-01-05', 
     'sales' => 1, 
     'price' => array(
      'usd' => 1, 
      'eur' => 100, 
      'gbp' => 500 
     ) 
    ), 
    2 => array(
     'date' => '2016-03-27', 
     'sales' => 5, 
     'age' => 50 
    ), 
    3 => array( 
     'date' => '2016-03-28', 
     'sales' => 10 
    ) 
); 

我期待下面的輸出:

$final = array(
    'March 2016' => array(
     'sales' => 15 
    ), 
    'January 2014' => array(
     'sales' => 2, 
     'price' => array(
      'usd' => 2, 
      'eur' => 200, 
      'gbp' => 500 
     ) 
    ) 
); 

我到目前爲止已經做了什麼?

$monthlyData = array(); 

foreach ($dailyData as $day) 
{ 
    $key = date('M y', strtotime($day['date'])); 

    if (!isset($monthlyData[$key])) 
    { 
     $monthlyData[$key] = $day; 
     continue; 
    } 

    foreach ($day as $metric => $value) 
    { 
     if(!empty($value)) 
     { 
      $monthlyData[$key][$metric] += $value; 
     } 
    } 
} 

嗯,我知道,我們可以爲了得到正確的結果使用好醇」 foreach(用遞歸調用),但是我正在尋找一些更好的解決方案。

+1

是來自MySQL表的數據嗎?如果是這樣,在查詢本身中可能更優雅。 – rybo111

+0

不,它是API的響應。 :-( – vitozev

+0

是''price'=>數組('您的第一個元素的'價格'或'價格'? – Federkun

回答

1

對於這個特定的例子,你真的只需要一個條件和循環。

foreach ($day as $metric => $value) 
{ 
    /* Added Condition */ 
    if(is_array($value)) 
    { 
     foreach($value as $nestedMetric => $nestedValue) { 
      $monthlyData[$key][$metric][$nestedMetric] += $nestedValue; 
     } 
    } 
    elseif(!empty($value)) 
    { 
     $monthlyData[$key][$metric] += $value; 
    } 
} 

但是,我可能會做不同的處理基於度量的計算,而不是動態地對待每個度量。

+0

提問的用戶不希望使用'foreach ' –

+0

@FaiyazAlam,是的,我忽略了最後一行,用戶很可能不得不在另一個循環中使用另一個循環,我們會看到是否有其他答案彈出來,如果OP正在尋找我們重寫他的代碼。 – Devon