使用PHP获取日期差异数组的平均值

时间:2012-02-14 21:15:46

标签: php

因此,我尝试使用自己构建的分析来获取用户在我的网站上花费的平均时间 我现在正在使用DateTime类,但数学似乎非常粗略。假设我有一系列登录时间和注销时间。

$array = array(
    array("login" => '2012-01-31 10:35:58', "logout" => '2012-02-01 10:35:58'),
    array("login" => '2012-02-04 10:35:58', "logout" => '2012-02-05 10:35:58')
  );

我想获得每次登录和退出之间的时间。然后获得所有这些时间的平均时间。

4 个答案:

答案 0 :(得分:6)

$total = 0;
$count = 0;
foreach ($array as $timestamp) {
    $diff = strtotime($timestamp['logout']) - strtotime($timestamp['login']);
    $total += $diff;
    $count++;
}

echo "Average session time is ", $total / $count;

为安全起见,最好使用DateTime::createFromFormat()进行日期 - >时间解析。你的时间戳是一个很好的正常格式,但当你有一些不稳定的格式时,strtotime是不可靠的。

同样,此代码假定所有登录/注销对都已完全定义。如果你有任何时间关闭,你最终会得到一些巨大的异常值,因为那些很可能是0,而不是正常的“现代”时间戳。

答案 1 :(得分:3)

您可以执行以下操作:

$sessions = array();
foreach($array as $s) {
    $sessions[] = strtotime($s['logout']) - strtotime($s['login']);
}

现在$sessions是一个包含所有会话长度的数组,以秒为单位,所以如果您这样做:

$average = array_sum($sessions) / count($sessions);

这是平均会话长度,以秒为单位。然后你可以用人类可读的格式打印它,但我想that's beyond the scope of this question

我首先将会话长度放在数组中而不是简单地在循环中将它们加起来的原因是你可以从中获取其他统计数据,例如最长/最短会话,中位数等。

答案 2 :(得分:2)

使用DateTime(已测试)的示例。

define('DATETIME_FORMAT', 'Y-m-d H:i:s');

$array = array(
    array('login' => '2012-01-31 10:35:58', 'logout' => '2012-02-01 10:35:58'),
    array('login' => '2012-02-04 10:35:58', 'logout' => '2012-02-06 10:22:58')
  );

$total = 0;
$count = 0;

foreach($array as $timeInfo)
{
  $loginDatetime = DateTime::createFromFormat(DATETIME_FORMAT, $timeInfo['login']);
  $logoutDatetime = DateTime::createFromFormat(DATETIME_FORMAT, $timeInfo['logout']);

  $total += ($logoutDatetime->getTimestamp() - $loginDatetime->getTimestamp());
  $count++;
}

$average = $total / $count;
echo "Average session duration: ".$average." seconds";

编辑:我最初使用数组来存储差异,以array_sum() / count()结尾来计算平均值,但我找到 Marc B 的解决方案$total$count更简单且肯定更快(这可能很重要,因为可能会处理大量登录/注销日期时间)。 =>在这里应用它。

答案 3 :(得分:1)

$ array = array(array(“login”=>“2012-01-31 10:35:58”,“logout”=>“2012-02-01 10:35:58”),                array(“login”=>“2012-02-04 10:35:58”,“logout”=>“2012-02-05 10:35:58”);

$ amount = 0;

foreach($ array as $ at)

{

  $amount += strtotime( $at[ "logout" ] ) - strtotime( $at[ "login" ] ) ;

}

$ average = $ amount / count($ array);

echo“amount:$ amount seconds \ naverage $ average seconds \ n”;