2013-12-18 30 views
0

我想查詢我們的數據庫以獲取與用戶定義的查詢匹配的所有記錄,並將數據存儲在格式化數組中。問題是,我得到了所有的記錄,但並不確定如何正確處理數據。我已經爲此工作了幾天,並且在嘗試了各種想法之後並沒有做出太多的努力。希望這裏有人能夠分享一些見解。PHP:從數據圖上繪製數據點(Google Graphs)

下面的代碼執行查詢,並開始返回的數據處理成數組:

$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秒)的數據,並希望每分鐘分離出它自己的關聯數組。 $ 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 
      ) 

    ) 
... 

(我沒有處理此刻的銳推,所以我乾脆將retweets數組作爲佔位符添加0)。

我想格式化它,以便在一個數組中,它包含tweet_count的值存儲在其中的唯一日期(下至分鐘)。上面以日期作爲關聯關鍵字的例子,以及$ k => $ v裏面是我試圖實現的。但是,當我繼續使用[0],[1]填充數組。 [12],[13]等。

我是否關閉?這已經是相當的兔子洞了......而且,它開始變成一個黑暗而孤獨的地方。 :(

回答

0

,而不是像這樣使用

array_push($msg_vol, $xy_coords); 

陣推爲什麼不嘗試

$array[] = $xy_coords; 

至於重複的爲什麼不能在你的MySQL查詢中使用SELECT DISTINCT

+0

我最終從array_push更改爲$ msg_vol [] = $ xy_coords,並得到相同的結果。所以,這很好,也更清楚一點。至於SELECT DISTINCT,我不確定我可以如何實現,因爲多行將具有相同的created_at日期,並且我仍然需要與查詢的其餘部分匹配的行。也許我誤解了... – DroBuddy

+0

我也許會誤解。哪個領域需要獨特? –

+0

我將代碼更新爲當前的樣子,並試圖進一步澄清它。 Y-m-d H:我應該是一個唯一的數組索引,其中$ k => $ v是數組屬性。所以,在上面的代碼中,數組元素[2013-12-15 19:09] =>數組是正確的,但其他人是多餘的,我不知道如何去掉它們。 – DroBuddy

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函數。他們是一個生活(和,頭髮)保護者!