PHP-while语句中的多个条件

时间:2018-07-13 15:30:24

标签: php while-loop

由于某种原因,该代码无法在我的编译器中运行。目的(作为大型项目的一部分)是要对特定主机执行ping 3次或直到成功为止,以先到者为准。它不会产生任何错误,只是终止。如果我从while语句中删除第二个条件,它就可以正常工作,但是如果成功执行ping操作,终止循环将需要更复杂的操作。我已经有一段时间没有接触PHP了,所以我可能缺少一些愚蠢的东西。

<?php
function pingAddress($ip) {
//Set variable to limit loops and end if live
$pass = 0;
$result = 0;
//Create conditions for while loop
while( ( $pass < 3 ) && ( $result = 0 ) ) {
    //Count loops
    $pass++;
    //Execute ping
    $output=shell_exec('ping -n 1 '.$ip);
    //Display ping results for testing purposes
    echo "<pre>$output</pre>";
    //Check for "TTL" presence
    if(strpos($output, 'TTL') !== false)
    {
        //Notate positive result
        $result++;
        //Display for testing
        echo "Alive";
    }
    //Display negative result for testing
    else
    {
        echo "Dead";
    }
}
}


PingAddress("8.8.8.8");

4 个答案:

答案 0 :(得分:5)

你会踢自己:

while( ( $pass < 3 ) && ( $result = 0 ) ) {

应该使用双精度等于-这是一个比较,而不是赋值:

while( ( $pass < 3 ) && ( $result == 0 ) ) {

答案 1 :(得分:4)

您不需要第二个变量 (?s) # Dot-all modifier ^ # BOS \[ # Open [ \s* # optional wsp " # Open dbl quote [^"\\]* # optional not dbl quote nor escape (?: \\ . [^"\\]* )* # optional escape anything, not dlb quote nor escape " # Close dbl quote (?: # Cluster \s* , \s* # opt wsp, comma, opt wsp " # Same as above [^"\\]* (?: \\ . [^"\\]* )* " )* # End cluster, do 0 to many times \s* # optional wsp \] # Close ] 。请改用https://regex101.com/r/mT66Nd/1

$result

您甚至可以使用以下代码编写更少的代码

while($pass < 3) {
    //Count loops
    $pass++;
    //Execute ping
    $output=shell_exec('ping -n 1 '.$ip);
    //Display ping results for testing purposes
    echo "<pre>$output</pre>";
    //Check for "TTL" presence
    if(strpos($output, 'TTL') !== false)
    {
        //Display for testing
        echo "Alive";

        break; //exiting while loop
    }
    //Display negative result for testing
    else
    {
        echo "Dead";
    }
}

答案 2 :(得分:0)

您的第二个条件写错了。将其更改为$result === 0

答案 3 :(得分:0)

使用不等于的运算符。

while( ( $pass < 3 ) && ( $result == 0 ) )

这应该有效。