2016-04-06 27 views
2

Ben şu girişi:toplamı

$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 
    ) 
); 

Ve şu çıktıyı bekliyoruz: Şimdiye kadar

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

yaptık?

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

Sanırım doğru sonucu elde etmek için (özyinelemeli çağrıları ile) iyi ol' foreach kullanabileceğinizi biliyor, ama biraz daha düzenli bir çözüm arıyorum.

+1

Veriler bir MySQL tablosundan mı geliyor? Eğer öyleyse, sorguda kendisini toplamak daha zarif olabilir. – rybo111

+0

Hayır, API'dan yanıt. :-( – vitozev

+0

'' fiyat '=> dizi ('ilk öğeniz a' fiyat' veya 'fiyatlar'' ' – Federkun

cevap

1

Bu özel örnek için gerçekten bir koşul ve döngüye gerçekten ihtiyacınız var.

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

Ancak, ben muhtemelen ölçüm türüne göre hesaplama ele alarak farklı yapardım sadece dinamik Her metrik tedavi etmemenin.

+0

Soruyu soran kullanıcı 'foreach’ı kullanmak istemez '. –

+0

@FaiyazAlam, evet, ben son satırı göz ardı.Kullanıcı muhtemelen bir noktada başka bir döngü kullanmak zorunda kalacak, biz başka bir cevaplar pop up olup olmadığını göreceğiz.Bu OP bizi arıyorsa oldukça geniş onun kodunu yeniden yazmak için. – Devon