回頭率是衡量用戶留存的關鍵指標。本文解析一個支援自定義時間區間與應用類型的 PHP 計算函式,適用於遊戲、社群等日活統計場景。
<?php
public function probability() {
global $_INPUT;
$ret = [];
// 解析日期參數,預設為今天
$time = (!empty($_INPUT['date']) && preg_match('/^\d{4}-\d{2}-\d{2}$/', $_INPUT['date']))
? strtotime($_INPUT['date'])
: strtotime('today');
$today = $time; // 當天 00:00:00
$tomorrow = $time + 86400; // 隔天 00:00:00
$flag = 1; // 是否參與比賽
$model = Model::getInstance('logs.fixedlog');
$paymodel = Model::getInstance('main.payment');
$stats = [];
$num = 0; // 連續回頭人數
$option = isset($_INPUT['app']) ? intval($_INPUT['app']) : 1;
$interval = isset($_INPUT['period']) ? intval($_INPUT['period']) : 1; // 區間天數
if ($option == 1) {
// 模式一:計算連續 N 天回頭人數
for ($i = 0; $i <= $interval; $i++) {
$res = $model->turnround($today, $tomorrow, $flag);
$temp = [];
foreach ($res as $value) {
$inmatch = isset($value['inmatch']) ? json_decode($value['inmatch']) : [];
foreach ($inmatch as $val) {
if (!in_array($val, $temp)) {
array_unshift($temp, $val); // 去重
}
}
}
if ($i == 0) $total = count($temp); // 首日總參與人數
// 將會員 ID 對應到當天索引
$temp = array_fill_keys($temp, $i);
foreach ($temp as $k => $v) {
if (array_key_exists($k, $stats)) {
$stats[$k] .= "," . $v; // 追加日期索引
} else {
$stats[$k] = $v;
}
}
$today -= 86400;
$tomorrow -= 86400;
}
// 統計連續出現天數等於區間長度的會員
$strlen = ($interval + 1) * 2 - 1; // 如 "0,1,2" 長度為 5
foreach ($stats as $v) {
if (isset($v) && strlen(trim($v)) == $strlen) {
$num++;
}
}
$ret['turnround']['all'] = $stats;
$ret['turnround']['total'] = $total;
$ret['turnround']['stats'] = count($stats);
$ret['turnround']['num'] = $num;
} else {
// 模式二:計算付費轉換率
$res = $model->turnround($today, $tomorrow, $flag);
$temp = [];
foreach ($res as $value) {
$inmatch = isset($value['inmatch']) ? json_decode($value['inmatch']) : [];
foreach ($inmatch as $val) {
if (!in_array($val, $temp)) array_unshift($temp, $val);
}
}
foreach ($temp as $k => $v) {
$paystatus = $paymodel->hasCharge($v, $tomorrow, $today - 1);
if (isset($paystatus) && $paystatus['num'] != 0) $num++;
}
$ret['payrate']['all'] = $temp;
$ret['payrate']['total'] = count($temp);
$ret['payrate']['num'] = $num;
}
return $this->ret($ret);
}
?>
$stats:['member_id' => '0,1,2'] 記錄各會員出現的日期索引$interval:統計天數,預設 1 表示連續 2 天(含首日)