奇怪的循环语法

时间:2016-11-24 16:13:54

标签: php for-loop

我已经在php中编程了大约两年了。

我偶然发现了这个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';

我不知道这应该如何运作。

有人可以向我解释一下吗?

3 个答案:

答案 0 :(得分:7)

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

来自manual

for (expr1; expr2; expr3)
      statement
     

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

     

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

     

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

所以:

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

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

    # no expr3
);

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

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

$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

答案 1 :(得分:3)

迟到,但似乎没有人缓存过这个:这个for循环相当于:

$i = 1;

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

$i < $uriSize 
&&
$uriArr[$i] != $wsDir 
&&
$i++;

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

答案 2 :(得分:2)

这是在没有第三个语句的情况下使用for的另一个例子(不是这样的答案)。它比原来的问题更清晰。

public static final char[] f4516b;
....
 static {
    f4516b = new char[]{'h', 't', 't', 'p', ':', '/', '/', '1', '0', '0', '.', '1', '0', '.', '1', '0', '0', '.', '1', '0', '/'};

这将基本上计为10并将其回显,而这只能通过PHP中的increment运算符实现。

首先我们将for ($i=0; $i >= $i++ && $i <= 10; /* third statement */ ); echo $i; 设置为零;

其次,我们检查并增加$i以确保它等于或大于自身,同时小于或等于10.

第三,我们什么都不做......真的没有意义......

然而,正常人会写同样的事情:

$i

你必须想象一个更好的用例,是的,你可以做for ($i = 0; $i <= 10; $i++); echo $i; ,但它没有解释这个问题。