2012-04-29 8 views
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日に変換することができます。しかしグラフは、その日にゼロを意味する連続しない日がいつあるかを知らない。PHPの時刻を日数に変換して空白の日数を入力し、結果を数えます。

このグラフはログイン統計情報です。ログインしていなければ、データベースには存在しません。私は空白の日にゼロログインがあると定義しなければなりません。私はデータベースになかった空白を埋めるためにループを作った。

しかし、別の問題が発生しました。私が記入した日数は、その存在のためにログインとみなされました。私は$zeroという別の配列を作成して、これらの日を保存し、その日がゼロかどうかをチェックしました。私はちょうどそれを働かせることができませんでした。

データベースの値は、time();に保存されています。私は、関数convertDatesを使用して日付に変換します。ここから数日があるので、その日のログイン数を調べるために、私はarray_count_values()を使用して別の配列に格納しました。その後、重複した日を削除して、それぞれのarray_count_values()キーとペアにしました。ここからは、私が記入した日に確実にする方法を理解することができません、それはゼロとして表示されます。

jqplotグラフでは、ログインがゼロであることはわかりません。私はその日にゼロがあったとPHPに言わせる必要があります。

誰も私にこのアドバイスを得る助けとなるアドバイスはありますか?

ありがとうございます。

答えて

2

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

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

はこの後、$required_daysは、最初と最後の日までの間のすべての日付が含まれます。あなたが合っているようにそこから進んでください。 のキーが日付であり、値がその日付のすべてのログインである配列を持つ方が便利かもしれません。

Y-d-mの代わりにY-m-dを使用しました。

更新:データベースに存在しない日付を検出:私が示唆したように

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

$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; 
    } 
} 

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

+0

です。データベースになかった日を検出するとどういう提案がありますか? – Kyle

+0

@Kyle:それは単純なはずです。編集された記事を参照してください。 – DCoder

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; 
    } 
} 
関連する問題