PHP按日期将数据从mysql排序到数组

时间:2015-12-12 20:25:28

标签: php arrays

我想显示过去30天(包括今天)的用户的统计信息。 但是在我的数据库中只有特定日期的统计信息,如果用户做了任何操作。如果不是,那么日期就不存在,而且这一天的值只需要为0.这是我目前的方法,数据是从数据库接收的,但它没有被正确插入。

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt2 = $conn->prepare("SELECT * FROM all_stats WHERE user_id = :user_id ORDER BY date DESC LIMIT 30"); 
$stmt2->bindParam(':user_id', $user_id, PDO::PARAM_INT);
$stmt2->execute();

$rows2 = $stmt2->fetchAll(PDO::FETCH_ASSOC);
// Create array with dates of the last 29 days and today.
for($i=29;$i>=0;$i--){
    $dates[$i] = date("Y-m-d", strtotime("-".$i." day" ));
}
// Check what rows are available
$y=0;
foreach ($rows2 as $row) {
   $daterow[$y] = $row['date'];
   $us[$y] = $row['US'];
   $ca[$y] = $row['CA'];
   $au[$y] = $row['AU'];
   $gb[$y] = $row['GB'];
   $de[$y] = $row['DE'];
   $y++;                       
}
$size = count($us);
for ($i = 0; $i<=29;$i++){
    if ( strtotime( $daterow[$i]) != strtotime($dates[$i]) ){
        $daily[$i] = 0;
    } else {
        $daily[$i] = $us[$i];
    }
}

测试数据为:今日数据可用,昨天为空,前天数据可用。

输出,仅插入今天的数据(在[0]处)错误

Array ( [0] => 333 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 [14] => 0 [15] => 0 [16] => 0 [17] => 0 [18] => 0 [19] => 0 [20] => 0 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 [28] => 0 [29] => 0 )

1 个答案:

答案 0 :(得分:2)

问题在于,在完成上一个循环时,在 $ daterow $ dates 数组中使用相同的索引。这不是你想要的,因为匹配的值不会在同一个索引上。

我建议使用array_search

执行此操作
// Create array with dates of the last 29 days and today.
for($i=29;$i>=0;$i--){
    $dates[$i] = date("Y-m-d", strtotime("-".$i." day" ));
    // at the same time initialise $daily
    $daily[$i] = 0;
}
// Check what rows are available
$y=0;
foreach ($rows2 as $row) {
    $daterow[$y] = $row['date'];
    //... etc..
    // Now search the $dates for the date we just read from the DB:
    $i = array_search($row['date'], $dates);
    if ($i !== false) {
        // There was a match, so add up what we have for US:
        $daily[$i] += $row['US'];
    }
    $y++;
}

以上假设 $ row [&#39; date&#39;] 的日期格式与 $ dates 的元素类似,即YYYY-MM -DD。如果不是这种情况,您可能需要做一些调整,但这个想法应该有效。