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
相关产品推荐
相关产品推荐

