2
<?php
function convertDates($timestamp) {
    return date('Y-d-m', $timestamp);
}

$days = array(); //store all the times in this array
$occurences = array(); //count all the occurences for each day
$complete = array(); //fill in missing days in this array
$zero = array(); //missing days mean zero

$query = mysql_query("SELECT `login` FROM `statistics` ORDER BY `login` ASC");
while($rows = mysql_fetch_array($query)) {
    $days[] = $rows['login'];
}
$days[] = time(); //append todays time in the array

for($i = 0; $i < count($days); $i++) {
    $complete[] = convertDates($days[$i]);
    $difference = isset($days[$i+1]) ? $days[$i+1] - $days[$i] : $days[$i] - $days[$i];
    if($difference > 86400) {
        $difference /= 86400;
        $fill = $days[$i];
        for($k = 0; $k < $difference; $k++) {
            $fill += 86400;
            $complete[] = convertDates($fill); //fill in missing days
            $zero[] = convertDates($fill); //count this day as a zero
        }
        echo ceil($difference).' days missing between '.convertDates($days[$i+1]).' and '.convertDates($days[$i]).'<br/>';
    }
    //echo convertDates($days[$i]).'<br/>';
}

$occurences = array_count_values($complete); //count all duplicates of days, here will be the count of days
$complete = array_unique($complete); //remove duplicate days from array
sort($complete); //sort it again

//print_r($zero);
//print_r($occurences);

/*Here checking the logins for each day, including days that did not exist, but filled in as zero. Note calling them duplicates just means occurrences.*/
for($i=0; $i < count($occurences); $i++) {
    if(in_array($complete[$i], $zero)) {
        echo "$i [".$complete[$i]."] has  0 duplicates (". $occurences[$complete[$i]] .")<br/>";
    } else {
        echo "$i [".$complete[$i]."] has ".$occurences[$complete[$i]] . " duplicates<br/>";
    }
}

echo "Days with empty days ".count($days)."<br/>";
echo "Days after being filled ".count($complete);
?>

jqplotを使用してグラフを作成していますが、タイムスタンプに問題が発生しました。タイムスタンプを1日に変換できます。ただし、グラフには、連続していない日がいつあるかはわかりません。その日はゼロを意味します。

このグラフはログイン統計用です。ログインがなかった場合、データベースにはありません。空白の日にログインがゼロであったことを定義する必要があります。データベースにない空白を埋めるためにループを作成しました。

しかし、私は別の問題に遭遇しました。私が記入した日数は、その存在のためにログインとしてカウントされました。$zero最近、保存するために呼び出される別の配列を作成して、その日がゼロになるかどうかを確認しようとしました。私はそれを機能させることができませんでした。

データベースの値はphptime();に保存されます。関数を使用して値convertDatesを日数に変換します。ここから数日あるので、その日のログイン数を数えるために、それを使用array_count_values()して別の配列に格納しました。次に、重複する日を削除し、その日をそれぞれのarray_count_values()キーとペアにしました。ここから、入力した日に確認する方法がわかりません。ゼロとして表示されます。

jqplotグラフは、ログインがゼロであることを認識していません。その日はゼロだったとphpに言わせなければなりません。

誰かが私がこれを機能させるのを助けるためにここから何かアドバイスがありますか?

お時間をいただきありがとうございます。

4

2 に答える 2

2

2番目の数学を使用して日付/時刻の差を計算しないでください。PHPは、これを行うDateTimeための便利DateTime::modifyなメソッドをクラスに提供します。私はあなたがこのようなことをする必要があると想像します:

for($dt = $earliest_date; $dt <= $latest_date; $dt->modify('+1 day')) {
  $required_days []= $dt->format('Y-m-d');
}

この後、$required_days最も早い日付から最も遅い日付までのすべての日付が含まれます。必要に応じて、そこから進んでください。キーが日付で、値がその日付のすべてのログインである配列がある方が便利な場合があります。

Y-m-dあなたの代わりに私が使ったことに注意してくださいY-d-m

更新:データベースにない日付を検出します:

私が提案したように、期間内の各日付をキーとして配列を作成し、その日付のすべてのログインを値として保持する配列を作成できます。

$logins_by_date = array();
foreach($required_days as $date) {
  $logins_by_date[$date] = array();
}

foreach($days as $login_datetime) {
  $dt = new DateTime($login_datetime);
  $key = $dt->format('Y-m-d');
  if(array_key_exists($key, $logins_by_date)) {
    $logins_by_date[$key] []= $login_datetime;
  } else {
    throw new Exception("Logical error - date {$key} does not exist in the login date map!");
  }
}

$empty_days = array();

foreach($logins_by_date as $date => $logins) {
  if(count($logins) == 0) {
    $empty_days []= $date;
  }
}

$empty_daysこれは、ログインが0であったすべての日付で埋める必要があります。

于 2012-04-29T19:15:16.200 に答える
0
$logins_by_date = array();
foreach($required_days as $date) {
  $logins_by_date[$date] = array();
}

foreach($days as $login_datetime) {
  $dt = new DateTime($login_datetime);
  $key = $dt->format('Y-m-d');
  if(array_key_exists($key, $logins_by_date)) {
    $logins_by_date[$key] []= $login_datetime;
  } else {
    throw new Exception("Logical error - date {$key} does not exist in the login date map!");
  }
}

//$empty_days = array();

foreach($logins_by_date as $date => $logins) {
  if(count($logins) == 0) {
    $empty_days []= $date;
  }
}
于 2013-09-23T12:03:31.213 に答える