PHP修剪问题

时间:2013-12-31 01:17:31

标签: php asterisk trim

我在过去的4个小时里撞了我的脑袋,我不明白为什么我的第二个装饰会造成重复。 没有修剪的代码效果很好,可以生成我想要的内容。

<h1>Offline Phones</h1>
<?php

// Query For All Peers
exec("/usr/sbin/asterisk -r -x 'sip show peers'", $response);

foreach($response as $line) {


  $offline = $line;

    if (strpos($offline, "UNKNOWN")>0) {
    print "<span style='color:red;'>$offline</span><br>";  
    }
}
?>

<h1>Online Phones</h1>
<?php

// Query For All Peers
exec("/usr/sbin/asterisk -r -x 'sip show peers'", $responses);

foreach($responses as $lines) {
$online = $lines;


    if (strpos($online, "OK")>0) {

    print "<span style='color:green;'>$online</span><br>";   
    }
}
?>

以上代码产生: 离线手机

302(未指定)D N A 0 UNKNOWN 303(未指定)D N A 0 UNKNOWN 304(未指定)D N A 0 UNKNOWN 305(未指定)D N A 0 UNKNOWN 306(未指定)D N A 0 UNKNOWN 在线电话

301/301 192.168.1.96 D N A 45009 OK(6 ms) 307/307 192.168.1.112 D N A 50175 OK(5 ms)

但是当我向两个查询添加修剪(参见下面的代码)时,第二个查询有重复的项目。

<h1>Offline Phones</h1>
<?php

// Query For All Peers
exec("/usr/sbin/asterisk -r -x 'sip show peers'", $response);

foreach($response as $line) {


  $offline = $line;

    if (strpos($offline, "UNKNOWN")>0)
    $clean_offline = trim($offline, '(Unspecified) D N A 0 UNKNOWN');
    {
    echo "<span style='color:red;'>$clean_offline</span><br>";  
    }
}



// Query For All Peers
exec("/usr/sbin/asterisk -r -x 'sip show peers'", $responses);

foreach($responses as $lines) {

   $online = $lines;


    if (strpos($online, "OK")>0) 

    $clean_online = trim($online);
    {
    echo "<span style='color:green;'>$clean_online</span><br>";   
    }
}
?>

此代码生成重复项,如下面的输出所示。您会注意到我甚至没有添加修剪规则。

302 303 304 305 306 306 306

301/301 192.168.1.96 D N A 45009 OK(5 ms) 301/301 192.168.1.96 D N A 45009 OK(5 ms) 301/301 192.168.1.96 D N A 45009 OK(5 ms) 301/301 192.168.1.96 D N A 45009 OK(5 ms) 301/301 192.168.1.96 D N A 45009 OK(5 ms) 301/301 192.168.1.96 D N A 45009 OK(5 ms) 307/307 192.168.1.112 D N A 50175 OK(5 ms) 307/307 192.168.1.112 D N A 50175 OK(5 ms)

......应该只有301/301 192.168.1.96 D N A 45009 OK(5 ms)&amp; 307/307 192.168.1.112 D N A 50175 OK(5 ms)此处。有谁能告诉我哪里出错了?

先谢谢。

2 个答案:

答案 0 :(得分:2)

您错过了{}括号。您希望在if之后运行的所有代码都应该包含在那里。所以

if (strpos($offline, "UNKNOWN")>0)
$clean_offline = trim($offline, '(Unspecified) D N A 0 UNKNOWN');
{
echo "<span style='color:red;'>$clean_offline</span><br>";  
}

应该是

if (strpos($offline, "UNKNOWN")>0)
{
  $clean_offline = trim($offline, '(Unspecified) D N A 0 UNKNOWN');
  {
    echo "<span style='color:red;'>$clean_offline</span><br>";  
  }
}

与下一个代码块相同

if (strpos($online, "OK")>0) 

$clean_online = trim($online);
{
echo "<span style='color:green;'>$clean_online</span><br>";   
}

应该是

if (strpos($online, "OK")>0) 
{
   $clean_online = trim($online);
   {
      echo "<span style='color:green;'>$clean_online</span><br>";   
   }
}

这不是trim()的问题,而是将strpos分配给$online的{​​{1}}条件,仅评估一次并用于所有后续迭代。

答案 1 :(得分:0)

这看起来不正确:

foreach($response as $line) {

  $offline = $line;

    if (strpos($offline, "UNKNOWN")>0)
    $clean_offline = trim($offline, '(Unspecified) D N A 0 UNKNOWN');
    {
    echo "<span style='color:red;'>$clean_offline</span><br>";  
    }
}

它应该是这样的:

foreach($response as $line)
{
    // strpos returns a position if exists, ZERO is valid
    // you get boolean false if it does not exist
    if(strpos($line, "UNKNOWN"))
    {
        echo "<span style='color:red;'>".trim($line, '(Unspecified) D N A 0 UNKNOWN')"</span><br>";     
    }
    elseif(strpos($online, "OK"))
    {
        echo "<span style='color:green;'>".trim($line)."</span><br>";
    }
}