2012-02-14 145 views
1

所以我试图通过我自己构建的分析来获取用户在我的网站上花费的平均时间。
我现在使用DateTime类,但数学似乎很粗略。假设我有一系列登录时间和注销时间。使用PHP获取日期差异数组的平均值

$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') 
); 

我想要了解每次登录和注销之间的时间量。然后获得所有这些时间的平均时间。

+1

你想要什么格式的平均返回时间?秒,分钟,小时,天? – crush 2012-02-14 21:19:19

+0

天,小时,分钟 – 2012-02-14 21:56:43

回答

5
$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()做日期 - >时间解析。你的时间戳是一个很好的正常格式,但当你有一些不可靠的格式时,时间戳是不可靠的。

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

+0

只能做'count($ array)' – Gordon 2012-02-14 21:54:48

+0

是的,那也行。 – 2012-02-14 21:56:41

+0

有没有内置的课堂或功能,我可以用来将秒转换成像4天,18小时,26分钟的格式? – 2012-02-14 22:12:26

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

的原因,我把会议长度在数组第一,而不是简单地在循环总结起来是,你可以再还可以获得其他统计出来的,像最长/最短会话,中位数等

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($数组作为$在)

{

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

}

$平均= $量/数($阵列);

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

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"; 

编辑: initally我使用一个数组来存储的diff,与array_sum()/count()结束计算平均,但我发现马克乙的解决方案与$total$count简单,肯定更快(它可能很重要,因为可能会处理大量的登录/注销日期时间)。 =>在这里应用它。