You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP数组计算求助:处理通话统计数据文件遇难题

解决PHP数组处理通话统计数据的计算问题

看起来你在处理这份通话统计数据的PHP数组计算时遇到了瓶颈,我来帮你一步步拆解解决。首先咱们先把data.txt里的非结构化文本转换成规整的PHP数组,再针对常见的计算需求给出可落地的代码方案。

先明确数据格式

你的data.txt里每一行是一条通话记录,字段对应关系如下:

Peer | Call ID | Duration | Recv: Pack | Recv: Lost | Recv: Lost (%) | Recv: Jitter | Send: Pack | Send: Lost | Send: Lost (%) | Send: Jitter

第一步:读取并解析数据为PHP数组

首先要把文本行转换成结构化的数组,方便后续计算:

// 读取data.txt,忽略空行和换行符
$lines = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

// 跳过第一行表头(如果你的文件第一行是表头的话)
array_shift($lines);

$callRecords = [];

foreach ($lines as $line) {
    // 用正则按多个空格拆分字段(避免Duration里的冒号干扰)
    $fields = preg_split('/\s+/', trim($line));
    
    // 整理成可读性强的结构化数组
    $callRecords[] = [
        'peer' => $fields[0],
        'call_id' => $fields[1],
        'duration' => $fields[2],
        'recv' => [
            'pack' => (int)$fields[3],
            'lost' => (int)$fields[4],
            'lost_percent' => (float)trim($fields[5], '()%'), // 清理括号和百分号转成浮点数
            'jitter' => (float)$fields[6]
        ],
        'send' => [
            'pack' => (int)$fields[7],
            'lost' => (int)$fields[8],
            'lost_percent' => (float)trim($fields[9], '()%'),
            'jitter' => (float)$fields[10]
        ]
    ];
}

第二步:常见计算需求的实现示例

有了结构化数组后,就可以轻松实现各种统计计算了,这里给几个常用场景的代码:

1. 计算总通话时长(把时分秒格式转成秒求和再转回格式)

// 辅助函数:把00:01:12格式转成秒数
function durationToSeconds($duration) {
    list($hours, $minutes, $seconds) = explode(':', $duration);
    return (int)$hours * 3600 + (int)$minutes * 60 + (int)$seconds;
}

$totalSeconds = 0;
foreach ($callRecords as $record) {
    $totalSeconds += durationToSeconds($record['duration']);
}

// 转回时分秒格式输出
$totalDuration = sprintf('%02d:%02d:%02d', floor($totalSeconds/3600), floor(($totalSeconds%3600)/60), $totalSeconds%60);
echo "总通话时长:{$totalDuration}\n";

2. 计算接收端的平均抖动值

// 提取所有接收端抖动值
$recvJitters = array_column(array_column($callRecords, 'recv'), 'jitter');
// 计算平均值(过滤掉抖动为0的无效记录可选)
$avgRecvJitter = array_sum($recvJitters) / count($recvJitters);
echo "接收端平均抖动:" . number_format($avgRecvJitter, 4) . "\n";

3. 统计存在丢包的通话记录

$lostCalls = array_filter($callRecords, function($record) {
    // 判断接收或发送端有丢包的情况
    return $record['recv']['lost_percent'] > 0 || $record['send']['lost_percent'] > 0;
});

echo "存在丢包的通话数:" . count($lostCalls) . "\n";

如果你的具体计算需求不是以上这些(比如统计某个Peer的总通话量、计算总丢包数据包数等),可以补充说明你的目标,我再调整代码逻辑。

内容的提问来源于stack exchange,提问作者Asterisk Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:53:57