在过去的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未知303(未指定)D N A 0未知304(未指定)D N A 0未知305(未指定)D N A 0未知306(未指定)D N A 0未知在线电话
301/301 192.168.1.96 D N A 45009正常(6毫秒)307/307 192.168.1.112 D N A 50175 OK(5 ms)
但是,当我向两个查询添加trims(请参阅下面的代码)时,第二个查询具有重复项。
<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>";
}
}
?>
此代码产生重复项,如下面的输出所示。你会注意到我甚至没有添加修剪规则。
302303304305306306306
301/301 192.168.1.96 D N A 45009正常(5毫秒)301/301 192.168.1.96 D N A 45009正常(5毫秒)301/301 192.168.1.96 D N A 45009正常(5毫秒)301/301 192.168.1.96 D N A 45009正常(5毫秒)301/301 192.168.1.96 D N A 45009正常(5毫秒)301/301 192.168.1.96 D N A 45009正常(5毫秒)307/307 192.168.1.112 D N A 50175正常(5毫秒)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毫秒)&此处为307/307 192.168.1.112 D N A 50175 OK(5 ms)。有人能告诉我哪里出了问题吗?
提前感谢。
您错过了{}
括号。您希望在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()
的问题,而是将$online
分配给$clean_online
的strpos
条件,只计算一次,并在所有后续迭代中使用。
这看起来不正确:
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>";
}
}