PHP:帮助这个逻辑

时间:2010-11-16 13:13:20

标签: php arrays multidimensional-array logic

我有问题。我有一张支持票据表(wh_task)。每个任务都有一个date_completed(d / m / Y)和has_met_sla字段(0或-1)。我想允许用户通过date_completed搜索此表,并根据结果显示图表。

图表数据必须如下所示,以便我可以填充条形图(融合图表):

年份:2010 |月:11月| SLA遇见:12 | SLA错过了:2

年份:2010 |月:10月| SLA遇见:15 | SLA错过:1

该图表的数字将沿x轴向上,“2010年11月”沿y向上。沿y的每个月都有2列,遇到并没有遇到。

所以,我可以创建这种图表没有问题,但它产生的数据我遇到了麻烦。以下是我的询问:

        $tsql = "SELECT task_id, has_met_service_level_agreement, date_completed ".
                "FROM wh_task ".
                "WHERE (task_status_id = 5) AND (account_id =$atid)";

        $stmt = sqlsrv_query( $conn, $tsql);
        if( $stmt === false)
        {
                 echo "Error in query preparation/execution.\n";
                 die( print_r( sqlsrv_errors(), true));
        }


        //SLA counters
        $met = 0;
        $missed = 0;



        /* Retrieve each row as an associative array and display the results.*/
        while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
        {
            $date = $row['date_completed'];
            $monthnumber = date_format($date, "n");
            $year = date_format($date, "Y");
            $hasmetsla = $row['has_met_service_level_agreement'];

        }


    }

你能帮我解释一下这里的逻辑吗?我猜我需要将数据存储在一个包含月份,年份,总计和未满足总数的数组中。然后为每个任务检查数组中是否已存在年月组合,如果是,则根据$ hasmetsla修改总计,如果不是,则将其添加到数组中?

全部谢谢!

Jonesy

2 个答案:

答案 0 :(得分:3)

我认为你最好在SQL中进行这种处理。使用两步解决方案:首先,找到一个查询,为您提供每行的年,月和sla_met。把它放在一个视图中。然后使用group_by,sum()和count()的巧妙组合对该视图进行查询,以计算所需的结果:

CREATE VIEW vw_sla AS SELECT DATEPART(year, date_completed) AS year, DATEPART(month, date_completed), CASE has_met_service_level_agreement WHEN 0 THEN 0 ELSE 1 END as sla_met

SELECT year, month, sum(sla_met), count(*) - sum(sla_met) FROM vw_sla GROUP BY year, month ORDER BY year DESC month DESC

您需要做的就是从数据库中获取数据,并将其显示在表格中。

答案 1 :(得分:1)

如果我必须在PHP中执行此操作,那么我会做什么(使用SQL会是更好的选择,但这是事后执行此操作的一种方法):

首先,我设置了一个具有以下结构的多维数组:

array(
    'year1' => array(
        'month1' => array(
            'met' => 0,
            'missed' => 0,
        ),
    ),
),

然后,我会更改while循环以执行以下操作:

$yearInfo = array();
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)) {
    $date = $row['date_completed'];
    $monthnumber = date_format($date, "n");
    $year = date_format($date, "Y");
    $hasmetsla = $row['has_met_service_level_agreement'];
    if (!isset($yearInfo[$year])) {
        $yearInfo[$year] = array(
            $monthnumber => array(
                'met' => 0, 
                'missed' => 0
            )
        );
    } elseif (!isset($yearInfo[$year][$monthnumber])) {
        $yearInfo[$year][$monthnumber] = array(
            'met' => 0,
            'missed' => 0,
        );
    }
    $key = $hasmetsla ? 'met' : 'missed';
    $yearInfo[$year][$monthnumber][$key]++;
}

然后,当你显示:

$data = '';
foreach ($yearInfo as $year => $months) {
    foreach ($months as $month => $status) {
        $data .= 'Year: '.$year.' | '.
              'Month: '.$month.' | '.
              'SLA Met: '.$status['met'].' | '.
              'SLA Missed: '.$status['missed']."\n";
    }
}