首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组计算PHP

数组计算PHP
EN

Stack Overflow用户
提问于 2018-04-07 23:35:28
回答 1查看 83关注 0票数 2

再一次,我被PHP数组计算卡住了,如果有人理解我的问题,请帮我解决,让我们解释一下…

data.txt内容

代码语言:javascript
复制
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 channels

PHP代码从这里开始。

代码语言:javascript
复制
$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数组的输出,这个>>

代码语言:javascript
复制
Array ( [0] => 10 [1] => 0 [2] => 0 )

在那之后,我就不能用数组做这个数学运算了,如果我把它们转换成变量-,我只需要1个数据,那么代码就能正常工作,但是当我试图得到所有我做不到的结果时,如果有人能理解我的问题,请帮助我。

代码语言:javascript
复制
$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 )

代码语言:javascript
复制
$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";
EN

回答 1

Stack Overflow用户

发布于 2018-04-08 15:10:53

如果我没弄错的话,最简单的解决方案是创建一个计算mosResult的函数

代码语言:javascript
复制
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循环中对所有结果应用该函数,如下所示

代码语言:javascript
复制
$length = count($list);
for($i = 0;$i < $length;$i++){ 
    $mosList[]=getMosResult($average[$i],$jitter[$i],$packet_loss[$i]);
}

这种解决方案不适合较大的项目,因为您会很快失去三个源数组之间的一致性。要获得更可靠的解决方案,请查看对象或最小关联数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49708989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档