再一次,我被PHP数组计算卡住了,如果有人理解我的问题,请帮我解决,让我们解释一下…
data.txt内容
Peer Call ID Duration Recv: Pack Lost ( %) Jitter Send: Pack Lost ( %) Jitter
139.59.232.196 0bb9262d6a1 00:01:12 0000003558 0000000000 ( 0.00%) 0.0000 0000001177 0000000000 ( 0.00%) 0.0200
139.59.232.196 41283499492 00:00:00 0000000000 0000000000 ( 0.00%) 0.0000 0000000000 0000000000 ( 0.00%) 0.0000
139.59.232.196 7033a541240 00:00:08 0000000000 0000000000 ( 0.00%) 0.0000 0000000019 0000000000 ( 0.00%) 0.0000
3 active SIP channelsPHP代码从这里开始。
$data = file_get_contents('./data.txt', TRUE);
$lines = explode("\n", $data);
foreach ($lines as $line) {
if (!preg_match('/( 0.00%)/', $line)) {
continue;
}
$data = explode(' ', $line);
$list[] = $data;
}
foreach ($list as $qoscalc) {
$average[] = ($qoscalc[17] * 1000 / 2);
$jitter[] = (int)$qoscalc[14];
$packet_loss[] = (int)$qoscalc[13];
}
print_r($average);到现在为止,代码运行得很好,它给了我$average数组的输出,这个>>
Array ( [0] => 10 [1] => 0 [2] => 0 )在那之后,我就不能用数组做这个数学运算了,如果我把它们转换成变量-,我只需要1个数据,那么代码就能正常工作,但是当我试图得到所有我做不到的结果时,如果有人能理解我的问题,请帮助我。
$effective_latency = ($average + $jitter * 2 + 10 );
if ($effective_latency < 160) {
$r_value = 93.2 - ($effective_latency / 40);
} else {
$r_value = 93.2 - ($effective_latency - 120) / 10;
}
$r_value = $r_value - ($packet_loss * 2.5);
$mosresult = 1 + (0.035) * $r_value + (0.000007) * $r_value * ($r_value - 60) * (100 - $r_value);
$moslist[] = $mosresult;我想得到所有3个数组的结果,假设如下所示: array ( => 4.40372901469 1 => 3.40372901469 2 => 4.90372901469 )
$i = 0; $t = 0; $e = 0; $g = 0; $f = 0; $p = 0; $b = 0;
foreach ($moslist as $mos) {
$i++;
if ($mos <= "5") {
$qosq = 'Excellent';
$e++;
} else if ($mos <= "4") {
$qosq = 'Good';
$g++;
} else if ($mos < "3") {
$qosq = 'Fair';
$f++;
} else if ($mos <= "2") {
$qosq = 'Poor';
$p++;
} else if ($mos <= "1") {
$qosq = 'Bad';
$b++;
} else {
continue;
}
$t++;
}
echo $qosq, "<br><br>\n";发布于 2018-04-08 15:10:53
如果我没弄错的话,最简单的解决方案是创建一个计算mosResult的函数
function getMosResult($average,$jitter,$packet_loss)
{
$effective_latency = ($average + $jitter * 2 + 10 );
if ($effective_latency < 160) {
$r_value = 93.2 - ($effective_latency / 40);
} else {
$r_value = 93.2 - ($effective_latency - 120) / 10;
}
$r_value = $r_value - ($packet_loss * 2.5);
return 1 + (0.035) * $r_value + (0.000007) * $r_value * ($r_value - 60) * (100 - $r_value);
}然后在for循环中对所有结果应用该函数,如下所示
$length = count($list);
for($i = 0;$i < $length;$i++){
$mosList[]=getMosResult($average[$i],$jitter[$i],$packet_loss[$i]);
}这种解决方案不适合较大的项目,因为您会很快失去三个源数组之间的一致性。要获得更可靠的解决方案,请查看对象或最小关联数组。
https://stackoverflow.com/questions/49708989
复制相似问题