2012-12-14 44 views
1

我正在尝试使用php和json构建一个延迟区域图表,以取得我在MySQL数据库中的数据点,并将它们平均为5分钟的时间间隔。我想知道这样的事情是否可能。使用php构建一个时间间隔的数组数值

当前代码:

mysql_select_db($mysql_db); 
$query = ("select date, (delta_msec * .001) from www where agent_id in (45517,45655,42189,38583,45872,38678,38289,39074,38069,42096,37987,45182,38974,44956,38630,38297,38571,39181,39063,41992,38293,37978) and date >='" . date("Y-m-d H:i:s", strtotime("30 minutes ago")) . "' and date <= '" . date("Y-m-d H:i:s", strtotime("now")) . "' order by date asc"); 
$result = mysql_query($query) or die($query. "<br/><br/>" .mysql_error()); 
while ($row = mysql_fetch_array($result)){ 
    $www[$q] = array("label" => $row[0], "value" => $row[1]); 
    $q++; 
} 

当使用

print_r ($www); 

我能够看到下面的(正确的)多维数组:

Array 
(
[0] => Array 
    (
     [label] => 2012-12-14 12:47:17 
     [value] => 0.618 
    ) 

[1] => Array 
    (
     [label] => 2012-12-14 12:47:17 
     [value] => 0.890 
    ) 

[2] => Array 
    (
     [label] => 2012-12-14 12:47:22 
     [value] => 1.908 
    ) 

[3] => Array 
    (
     [label] => 2012-12-14 12:47:37 
     [value] => 2.912 
    ) 

[4] => Array 
    (
     [label] => 2012-12-14 12:48:18 
     [value] => 1.275 
    ) 

[5] => Array 
    (
     [label] => 2012-12-14 12:48:25 
     [value] => 0.449 
    ) 

[6] => Array 
    (
     [label] => 2012-12-14 12:48:30 
     [value] => 7.831 
    ) 
) 

的阵列大得多比这个,但我想给它一个看起来如何的片段。

有了这些信息,我可以将其转换成JSON,并且FusionCharts将完美读取所有值。但是,这实际上只是一个重新格式化的“散点图”,它不能很好地阅读。我希望能够从这个数组中创建另一个数组,以便基本上可以创建5分钟的桶并平均所有的值,并在过去的4个小时内完成此操作。

我现在才开始学习PHP,MySQL和fusioncharts(一次完成)大约2-3周,这远远超出了我所学到的。任何人都可以协助创建这样的数组吗? (或任何其他方法?)或者我只能通过重新格式化我的SQL查询来拉取平均数据,然后再次调用该图的较小版本进行调用?

+0

你的问题是什么? – Ibu

+0

如果我很明白,你想每5分钟只有一个点的平均值? – berty

+0

我希望能够花5分钟价值的数据,并平均使用PHP,而不是改变我的SQL查询。我目前正在运行一个SQL查询,它直接从数据库中平均5分钟的数据。我想知道是否有可能以编程方式进行此操作。理由是当我提取数据时,我将需要所有的数据点,但默认情况是平均5分钟。这是否更有意义? (抱歉,很长的延迟,我责怪假日季节) – dragven

回答

0

你只需要一个函数将迭代你的数组和5个项目在一起,并计算平均值。我扔了一起: -

function get5MinAv(array $times) 
{ 
    $result = array(); 
    $counter = 0; 
    $temp['sum'] = 0; 
    foreach($times as $time){ 
     if($counter == 0)$temp['start'] = $time['label']; 
     $temp['sum'] += $time['value']; 
     $counter ++; 
     if($counter == 5){ 
      $temp['av'] = $temp['sum']/5; 
      $temp['end'] = $time['label']; 
      $result[] = $temp; 
      $temp['sum'] = 0; 
      $counter = 0; 
     } 
    } 
    return $result; 
} 

为了验证这一点,我产生类似于你的数组: -

$interval = new DateInterval('PT1M'); 
$date = new DateTime(); 
$times = array(); 

for($i = 0; $i < 120; $i++){ 
    $times[$i]['label'] = $date->format('Y-m-d h:i:s'); 
    $times[$i]['value'] = 1; 
    $date->add($interval); 
} 

,并把它称为是这样的: -

var_dump(get5MinAv($times)); 

我刚才把值为1以使检查变得容易,我已经用一个或两个其他值对它进行了测试,并且它似乎都工作正常。

如果你希望你可以用$times[$i]['value'] = rand(0, 1000)/100来种子,以提供更好的范围值,但检查会更困难。

输出的样本: -

array (size=24) 
    0 => 
    array (size=4) 
     'sum' => int 5 
     'start' => string '2012-12-28 12:13:24' (length=19) 
     'av' => int 1 
     'end' => string '2012-12-28 12:17:24' (length=19) 
    1 => 
    array (size=4) 
     'sum' => int 5 
     'start' => string '2012-12-28 12:18:24' (length=19) 
     'av' => int 1 
     'end' => string '2012-12-28 12:22:24' (length=19) 
    2 => 
    array (size=4) 
     'sum' => int 5 
     'start' => string '2012-12-28 12:23:24' (length=19) 
     'av' => int 1 
     'end' => string '2012-12-28 12:27:24' (length=19) 

很明显,你可以调整这个根据自己的喜好,但是这应该让你开始在正确的轨道上。此时该函数将忽略最后剩余的时间,而不会形成一组5.如果您想改变该行为,这对您来说将是一个很好的练习。

+0

完美的作品!非常感谢你! – dragven

相关问题