PHP:从图形上的MySQL绘制数据点(Google Graphs)

时间:2013-12-18 15:07:56

标签: php mysql arrays graph

我试图查询我们的数据库以获取与用户定义的查询匹配的所有记录,并将数据存储在格式化的数组中。问题是,我得到了所有记录,但不确定如何正确处理数据。我已经在这方面工作了几天,在尝试了各种各样的想法之后,我们还没有取得多少进展。希望这里有人可以分享一些见解。

下面的代码执行查询并开始将返回的数据处理到数组中:

    $msg_vol = array();
    $xy_coords = array();
    $tweet_count = 1;

    $query = "SELECT created_at, tweet_id FROM `tweets` WHERE tweet_text LIKE '%{$safe_q}%' AND created_at < now() - 300";
    $tweets = mysqli_query($db, $query);
    confirm_query($tweets);

    while ($tweet = mysqli_fetch_assoc($tweets)) {
        $created_at = $tweet['created_at'];
        $timestamp = strtotime($created_at);
        $created_at_no_seconds = date('Y-m-d H:i', $timestamp);

        if(!in_array($created_at_no_seconds, $xy_coords)) {
        $created_at = $tweet['created_at'];
        $timestamp = strtotime($created_at);
        $created_at_no_seconds = date('Y-m-d H:i', $timestamp);

        if(!in_array($created_at_no_seconds, $xy_coords)) {
            $xy_coords = array(0 => $created_at_no_seconds, array('tweet_count' => $tweet_count, 'retweets' => 0));
        } else {
            // $created_at_no_seconds exists in array
            // update array
            $msg_vol[$created_at_no_seconds] = array('tweet_count' => $tweet_count++, 'retweets' => 0);
        }
    }
    return $msg_vol;

我将$ created_at重新格式化为分钟,因为目前我只对最近5分钟(300秒)的数据感兴趣,并且希望每分钟分成一个&# 39;自己的关联数组。 $ created_at_no_seconds变量可能包含要添加到数组中的重复条目。所以,我玩弄了in_array()来尝试检查它是否存在,如果不存在则只将它添加到数组中。我还没有好运。

print_r($ msg_vol)提供以下输出(慢慢接近所需的输出):

[0] => Array
    (
        [created_at] => 2013-12-15 19:09
        [tweet_count] => 1
        [retweets] => 0
    )

[2013-12-15 19:09] => Array
    (
        [tweet_count] => 11
        [retweets] => 0
    )

[1] => Array
    (
        [created_at] => 2013-12-15 19:09
        [tweet_count] => 1
        [retweets] => 0
...
[12] => Array
    (
        [created_at] => 2013-12-15 19:10
        [0] => Array
            (
                [tweet_count] => 12
                [retweets] => 0
            )

    )

[2013-12-15 19:10] => Array
    (
        [tweet_count] => 20
        [retweets] => 0
    )

[13] => Array
    (
        [created_at] => 2013-12-15 19:10
        [0] => Array
            (
                [tweet_count] => 12
                [retweets] => 0
            )

    )
...

(我现在没有处理转发,所以我只是在转发数组中添加0作为占位符)。

我试图对其进行格式化,以便在一个数组中,它包含tweet_count的值存储在其中的唯一日期(一直到分钟)。上面的例子以日期作为关联键,并且$ k =&gt; $ v inside是我想要实现的目标。但是,当我继续使用[0],[1]填充数组时。 [12],[13]等。

我甚至关闭了吗?这一直是兔子洞......而且,它开始变成一个黑暗而孤独的地方。 :(

2 个答案:

答案 0 :(得分:0)

而不是像这样使用数组推送

array_push($msg_vol, $xy_coords);

为什么不试试

$array[] = $xy_coords;

关于重复项,为什么不在mysql查询中使用SELECT DISTINCT

答案 1 :(得分:0)

我能够通过优化查询来解决问题(谢谢#php)!

$query = "SELECT DATE_FORMAT(created_at, '%Y-%d-%m %H:%i'),";
    $query .= " COUNT(tweet_id), 0 FROM `tweets`";
    $query .= " WHERE tweet_text LIKE '%{$safe_q}%'" ;
    $query .= " AND created_at < now() - 300"; 
    $query .= " GROUP BY DATE_FORMAT(created_at, '%Y-%d-%m %H:%i')";
    $tweets = mysqli_query($db, $query);
    confirm_query($tweets);

    while ($tweet = mysqli_fetch_assoc($tweets)) {
        echo '<pre>';
        print_r($tweet); exit;
        echo '</pre>';
    }

利用MySQL功能。他们是生命(和头发)的救星!