将php时间转换为几天,填写空白天,然后计算结果

时间:2012-04-29 18:52:52

标签: php arrays jqplot

<?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创建一个图表,我遇到了时间戳问题。我可以将时间戳转换成一天。但是,图表不知道当天有非连续日期,那意味着零。

此图表用于登录统计信息。如果没有登录,则不会在数据库中。我必须在空白日定义零登录。我做了一个循环来填补数据库中没有的空白。

然而我遇到了另一个问题。我填写的日子由于它们的存在而被计为登录。我试图创建另一个名为$zero的数组来存储这些天并检查这一天是否应该是零。我无法让它发挥作用。

数据库中的值存储在php time();中我使用函数convertDates将它们变成了几天。从这里开始有几天,所以要计算当天使用array_count_values()的登录次数并将其存储到另一个数组中。然后我删除了重复的日期,并将其与相应的array_count_values()密钥配对。从这里我无法弄清楚如何确保我填写的日子,它显示为零。

jqplot图表不知道登录为零。我必须让php说当天有零。

有没有人从这里获得任何建议来帮助我实现这项工作?

感谢您的时间。

2 个答案:

答案 0 :(得分: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将包含最早和最晚日期之间的所有日期。在你认为合适的情况下从那里继续。拥有一个数组可能会更方便,其中 keys 将是日期,而值将是该日期的所有登录。

请注意,我使用的是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次登录的日期。

答案 1 :(得分: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;
  }
}