保持累积的月数

时间:2016-03-26 21:15:48

标签: php date graph cumulative-line-chart

我想保留日期中的月数,从CSV中读取日期以dd / mm / yyyy格式输入。 $all是这些日期的数组。我正在绘制学生在9月开始并在7月结束的学年的进展情况。日期代表学生的成就。我需要计算累积数量 - 9月份的日期也应计入所有后续月份等。然后我使用它来创建Google图表,如下所示:

An example graph

我有以下工作代码,感觉非常麻烦。我觉得我错过了一些可以更简洁的方法来解决我的问题。

是否有以这种方式处理日期的常见解决方案?你能建议更广泛的阅读吗?

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

}

2 个答案:

答案 0 :(得分:0)

我的建议不是存储累积数据,而是每月存储实际成就数量更容易。您可以填写array,其密钥为月(从1到12):

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

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

  $counts[$month]++;
}

修改

现在,您只需循环$counts即可规范化每个条目:

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

  }

}

答案 1 :(得分:0)

这是一个解决方案,应该给出相同的结果:

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