最近在做公司的BI系统,由于很多东西都是探索阶段,做起来遇到很多的问题,下面这个是其中一个计算一次访问会话的实现,还待优化和改进
/** * @param $data array(key=>array((int)view_time,url,referer)) order by value asc * @param $threshold * @param $delta * @return boolean */ function uvAlgorithm($data, $threshold, $delta) { $stack = array(); $rangeDown = $data[0]['view_time']; $vid = md5($rangeDown); $rangeUp = $data[0]['view_time'] + $threshold; // echo $rangeDown . '~' . $rangeUp . "\n"; // print_r($data); foreach ($data as $k=>$v) { if ($k == 0) { updateVisitId($v['id'], $vid); $stack[] = $v['url']; continue; } if ($v['view_time'] >= $rangeDown && $v['view_time'] < $rangeUp) { if (in_array($v['referer'], $stack) || ($data[$k]['view_time'] - $data[$k - 1]['view_time'] < $delta)) { $stack[] = $v['url']; updateVisitId($v['id'], $vid); } else { updateVisitId($v['id'], md5($v['view_time'])); } } else { $temp = array_splice($data, $k); // print_r($temp); // print_r($data); // print_r($stack); $stack = array(); if (empty($temp)) { return false; } else { uvAlgorithm($temp, $threshold, $delta); } } } }