奇怪的循环语法

Vas*_*dix 5 php for-loop

我已经在php中编程了大约2年了.

我偶然发现了这个for循环:

    // Check the URI namespace for a context
    $wsDir = basename(dirname(__FILE__));
    $uriArr = explode("/", $_SERVER['REQUEST_URI']);

    for (
        $i = 0, $uriSize = sizeof($uriArr);
        $i < $uriSize && $uriArr[$i] != $wsDir && $i++;
    );

    $i++;
    self::$executionContext = isset($uriArr[$i]) && !empty($uriArr[$i]) && substr($uriArr[$i], 0, 1) != '?'
        ? strtoupper($uriArr[$i]) : 'SOAP';
Run Code Online (Sandbox Code Playgroud)

我不知道这是怎么回事.

谁可以给我解释一下这个 ?

sid*_*yll 7

它只是一个正常的三部分循环而没有它的主语句和一个空的第三部分.

从手册:

for (expr1; expr2; expr3)
      statement
Run Code Online (Sandbox Code Playgroud)

第一个表达式(expr1)在循环开始时无条件地计算(执行)一次.

在每次迭代开始时,expr2进行评估.如果它的计算结果为TRUE,则循环继续并执行嵌套语句.如果计算结果为FALSE,则循环的执行结束.

在每次迭代结束时,expr3评估(执行).

所以:

for (
    # initializes two variables
    $i = 0, $uriSize = sizeof($uriArr);

    # conditional, expr2
    $i < $uriSize && $uriArr[$i] != $wsDir && $i++;

    # no expr3
);
Run Code Online (Sandbox Code Playgroud)

如果expr2计算结果为true,则循环继续.当然没有语句或块可以执行,因此它只是跳转到下一个迭代,意味着expr2将重复执行,直到它在某个时刻评估为false.

正如R. Chappell在评论中指出的那样,这可能是在一个字符串中找到一个位置.你可以用类似的逻辑重写它,但是以更"描述性"的方式:

$uriSize = sizeof($uriArr)

for ($i = 0; $i < $uriSize; $i++) {
    if ($uriArr[$i] == $wsDir) break;
}

# now $i will be the index of the first $wsDir occurrence in the $uriArr array
Run Code Online (Sandbox Code Playgroud)


Zim*_*mmi 3

来晚了,但似乎没有人缓存这个:这个 for 循环相当于:

$i = 1;
Run Code Online (Sandbox Code Playgroud)

为什么 ?因为在 for 循环的条件部分中,有 3 个与 绑定的条件AND:

$i < $uriSize 
&&
$uriArr[$i] != $wsDir 
&&
$i++;
Run Code Online (Sandbox Code Playgroud)

在第一次迭代中,$i++计算结果为 0,相当于 false,并且仅在之后递增。因此循环仅在一次迭代后停止,并且$i为 1,并且您有一个错误。除非你的代码有错别字...