2016-03-26 34 views
1

Tarihler, gg/aa/yyyy biçiminde girilen bir CSV'den okunan tarihlerde meydana gelen bir kaç ay tutmak istiyorum. $all, bu tarihlerin bir dizisidir. Eylül ayında başlayıp Temmuz ayında sona eren bir akademik yılda öğrencilerin ilerlemesini yapıyorum. Bir tarih öğrenci başarısını temsil eder. Ben kümülatif olmak sayımı gerek - Eylül ayında tarih de sonraki tüm aylarda vb sayılması gerekirken Sonra bu gibi bir Google grafik oluşturmak için kullanırızBir kümülatif ay sayısının tutulması

An example graph

Ben işçi kodu aşağıdakilere sahip çok hantal geliyor. Sorunumu çözmek için çok daha özlü bir yol sağlayacak bir şey eksik gibi hissediyorum.

Bu şekilde tarihlerle çalışmak için ortak çözümler var mı? Daha geniş bir okuma önerebilir misin?

foreach ($all as $y) { 
    $month = substr($y,3, 2); 

    switch ($month) { 
     case '09': 
      $sep++;$oct++;$nov++;$dec++;$jan++;$feb++;$mar++;$apr++;$may++;$jun++;$jul++; 
      break; 
     case '10': 
      $oct++;$nov++;$dec++;$jan++;$feb++;$mar++;$apr++;$may++;$jun++;$jul++; 
      break; 
     case '11': 
      $nov++;$dec++;$jan++;$feb++;$mar++;$apr++;$may++;$jun++;$jul++; 
      break; 
     case '12': 
      $dec++;$jan++;$feb++;$mar++;$apr++;$may++;$jun++;$jul++; 
      break; 
     case '01': 
      $jan++;$feb++;$mar++;$apr++;$may++;$jun++;$jul++; 
      break; 
     case '02': 
      $feb++;$mar++;$apr++;$may++;$jun++;$jul++; 
      break; 
     case '03': 
      $mar++;$apr++;$may++;$jun++;$jul++; 
      break; 
     case '04': 
      $apr++;$may++;$jun++;$jul++; 
      break; 
     case '05': 
      $may++;$jun++;$jul++; 
      break; 
     case '06': 
      $jun++;$jul++; 
      break; 
     case '07': 
      $jul++; 
      break; 
     default: 
      $jul++; 
    } 

} 

//All months initially set to 1 to help with scaling issues. 
//Work out percentage of all achievements completed 
$NOW = date("n"); 
switch($NOW) { 
    case '9': 
     if ($sep != 1) { 
      $sep = round(($sep-1)/$total*100); 
     } 
     $oct="null";$nov="null";$dec="null";$jan="null";$feb="null";$mar="null";$apr="null";$may="null";$jun="null";$jul="null"; 
     break; 

    case '10': 
     if ($oct != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
     } 
     $nov="null";$dec="null";$jan="null";$feb="null";$mar="null";$apr="null";$may="null";$jun="null";$jul="null"; 
     break; 

    case '11': 
     if ($nov != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
      $nov = round(($nov-1)/$total*100); 
     } 
     $dec="null";$jan="null";$feb="null";$mar="null";$apr="null";$may="null";$jun="null";$jul="null"; 
     break; 

    case '12': 
     if ($dec != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
      $nov = round(($nov-1)/$total*100); 
      $dec = round(($dec-1)/$total*100); 
     } 
      $jan="null";$feb="null";$mar="null";$apr="null";$may="null";$jun="null";$jul="null"; 
     break; 

    case '1': 
     if ($jan != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
      $nov = round(($nov-1)/$total*100); 
      $dec = round(($dec-1)/$total*100); 
      $jan = round(($jan-1)/$total*100); 
     } 
     $feb="null";$mar="null";$apr="null";$may="null";$jun="null";$jul="null"; 
     break; 

    case '2': 
     if ($feb != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
      $nov = round(($nov-1)/$total*100); 
      $dec = round(($dec-1)/$total*100); 
      $jan = round(($jan-1)/$total*100); 
      $feb = round(($feb-1)/$total*100); 
     } 
     $mar="null";$apr="null";$may="null";$jun="null";$jul="null"; 
     break; 

    case '3': 
     if ($mar != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
      $nov = round(($nov-1)/$total*100); 
      $dec = round(($dec-1)/$total*100); 
      $jan = round(($jan-1)/$total*100); 
      $feb = round(($feb-1)/$total*100); 
      $mar = round(($mar-1)/$total*100); 
     } 
     $apr="null";$may="null";$jun="null";$jul="null"; 
     break; 

    case '4': 
     if ($apr != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
      $nov = round(($nov-1)/$total*100); 
      $dec = round(($dec-1)/$total*100); 
      $jan = round(($jan-1)/$total*100); 
      $feb = round(($feb-1)/$total*100); 
      $mar = round(($mar-1)/$total*100); 
      $apr = round(($apr-1)/$total*100); 
     } 
     $may="null";$jun="null";$jul="null"; 
     break; 

    case '5': 
     if ($may != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
      $nov = round(($nov-1)/$total*100); 
      $dec = round(($dec-1)/$total*100); 
      $jan = round(($jan-1)/$total*100); 
      $feb = round(($feb-1)/$total*100); 
      $mar = round(($mar-1)/$total*100); 
      $apr = round(($apr-1)/$total*100); 
      $may = round(($may-1)/$total*100); 
     } 
     $jun="null";$jul="null"; 
     break; 

    case '6': 
     if ($jun != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
      $nov = round(($nov-1)/$total*100); 
      $dec = round(($dec-1)/$total*100); 
      $jan = round(($jan-1)/$total*100); 
      $feb = round(($feb-1)/$total*100); 
      $mar = round(($mar-1)/$total*100); 
      $apr = round(($apr-1)/$total*100); 
      $may = round(($may-1)/$total*100); 
      $jun = round(($jun-1)/$total*100); 
     } 
     $jul="null"; 
     break; 

    case '7': 
     if ($jul != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
      $nov = round(($nov-1)/$total*100); 
      $dec = round(($dec-1)/$total*100); 
      $jan = round(($jan-1)/$total*100); 
      $feb = round(($feb-1)/$total*100); 
      $mar = round(($mar-1)/$total*100); 
      $apr = round(($apr-1)/$total*100); 
      $may = round(($may-1)/$total*100); 
      $jun = round(($jun-1)/$total*100); 
      $jul = round(($jul-1)/$total*100); 
     } 
     break; 

    case '8': 
     if ($jul != 1) { 
      $sep = round(($sep-1)/$total*100); 
      $oct = round(($oct-1)/$total*100); 
      $nov = round(($nov-1)/$total*100); 
      $dec = round(($dec-1)/$total*100); 
      $jan = round(($jan-1)/$total*100); 
      $feb = round(($feb-1)/$total*100); 
      $mar = round(($mar-1)/$total*100); 
      $apr = round(($apr-1)/$total*100); 
      $may = round(($may-1)/$total*100); 
      $jun = round(($jun-1)/$total*100); 
      $jul = round(($jul-1)/$total*100); 
     } 
     break; 

    default: 
     echo " "; 

} 

cevap

0

Benim önerim birikimli verileri depolamak değil, ayda gerçek başarı sayısını saklamak daha kolay. Sen dolum yapabilirsiniz Anahtarları (1'den 12'ye kadar) aylık olduğu bir array:

$counts = array(); 
foreach ($all as $y) { 
    $month = (int)substr($y,3,2); 

    if (isset($counts[$month])) 
    $counts[$month] = 0; 

    $counts[$month]++; 
} 

EDIT'e Şimdi

sadece $counts üzerinde döngü her girdiyi normalleştirmek için edebilirsiniz:

$total = array_sum($counts); 
$sum = 0; 

// Avoiding division by zero 
if ($total != 0) { 

    foreach (array_merge(range(9,12),range(1,7)) as $key) { 

    $sum += $counts[$key]; 
    $counts[$key] = round($sum/$total*100); 

    } 

} 
0

Burada aynı sonuçları vermesi gereken bir çözüm var:

// Work with month numbers relative to school year: 
$cur_month = (3 + date("n")) % 12; // 0 = september, 1 = october, ... 

// Collect monthly statistics (August excluded) 
$stats = array_fill(0, 11, 0); 
foreach ($all as $date) { 
    // Extract month and transpose to school month: 0 = september, ... 
    $month = (3+substr($date,3, 2)) % 12; 
    // August is mapped to July 
    $month = min(11, $month); 
    // Only data in the past or current month is taken into account: 
    if ($month <= $cur_month) $stats[$month]++; 
} 

// Cumulate statistics: 
$total = 0; 
foreach ($stats as $month => &$stat) { 
    $total += $stat; 
    // Avoid zeroes for scaling problems 
    $stat = max(1, $total); 
} 

// Don't allow total == 0 
$total = max(1, $total); 

// Convert to percentages, and clear future months 
foreach ($stats as $month => &$stat) { 
    $stat = $month <= $cur_month 
     ? round($stat/$total * 100) 
     : 'null'; 
} 

// Assign to individual variables, if needed 
list($sep, $oct, $nov, $dec, $jan, $feb, 
    $mar, $apr, $may, $jun, $jul) = $stats;