2016-04-06 257 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