我在过去的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)此处。有谁能告诉我哪里出错了?
先谢谢。
答案 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>";
}
}