首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 計算用戶回頭率邏輯實作

     編輯:PHP 相關知識

PHP 計算用戶回頭率邏輯實作

回頭率是衡量用戶留存的關鍵指標。本文解析一個支援自定義時間區間與應用類型的 PHP 計算函式,適用於遊戲、社群等日活統計場景。

核心函式:probability()

<?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);
}
?>

邏輯流程圖解

  1. 參數解析:日期、應用類型、統計區間
  2. 逐日查詢:呼叫 Model 取得每日參與會員
  3. 去重與記錄:以會員 ID 為鍵,值為日期索引字串
  4. 模式一:檢查字串長度判斷是否連續全勤
  5. 模式二:交叉付費模型統計付費人數

資料結構說明

  • $stats:['member_id' => '0,1,2'] 記錄各會員出現的日期索引
  • $interval:統計天數,預設 1 表示連續 2 天(含首日)
  • 回傳 JSON 包含明細、總人數、有效統計數、達標人數

效能優化建議

  • 大量會員時改用 Redis Bitmap 或 HyperLogLog 統計
  • Model 層加入快取,避免重複查詢同一日誌
  • 付費查詢可預先彙總每日付費會員集合,減少即時查詢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved