奇怪的 for 循环语法
Posted
技术标签:
【中文标题】奇怪的 for 循环语法【英文标题】:Strange for loop syntax 【发布时间】:2017-04-09 00:30:45 【问题描述】:我已经用 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';
我不知道这应该如何工作。
谁能给我解释一下?
【问题讨论】:
如果你找到写这篇文章的人,我有几个选择词给他们:P。 看起来它正在寻找 URI 中基目录的结束位置。 for 循环不需要块,它会无条件地执行第一个表达式一次。然后它将在第二个条件为真时执行。第三个条件是空的,意味着它什么都不执行。 PHP Docs 确实在示例 4 中表明它可以在没有语句块的情况下使用。 @R.Chappell 如果你仔细观察,你会发现 for 循环条件是 2,而不是 3。据我所知,这样做的唯一想法是初始化$i
@VasilShaddix 在for循环中第二个语句的末尾是一个;
,表示有3个语句,只是第三个是完全空的。
【参考方案1】:
这只是一个普通的三部分 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
评估为真,则循环继续。当然没有要执行的语句或块,所以它只是跳转到下一个迭代,这意味着 expr2
将被重复执行,直到它在某个时候评估为 false。
正如 R. Chappell 在 cmets 中指出的那样,这可能是在字符串中找到一个位置。您可以用类似的逻辑但以更“描述性”的方式重写它:
$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
【讨论】:
这实际上让我很清楚。谢谢@sidyll 感谢@VasilShaddix,很高兴现在更清楚了。我刚刚用重写更新了答案 感谢您的提及 :)【参考方案2】:来晚了,但似乎没有人缓存这个:这个for循环相当于:
$i = 1;
为什么?因为在 for 循环的条件部分,您有 3 个条件与 AND
绑定:
$i < $uriSize
&&
$uriArr[$i] != $wsDir
&&
$i++;
在第一次迭代中,$i++
的计算结果为 0,相当于 false,并且仅在之后递增。所以循环只在一次迭代后停止,$i
是 1,你有一个错误。除非它是您的代码中的拼写错误...
【讨论】:
:-O 你真是个天才! 我也迟到了。在那之后我正在查看代码,我也看到了它。谢谢你。这其实是正确的答案。【参考方案3】:这是在没有第三个语句的情况下使用 for 的另一个示例(不是这样的答案)。比原来的问题要清楚一点。
for ($i=0; $i >= $i++ && $i <= 10; /* third statement */ );
echo $i;
这基本上会计数到 10 并回显出来,并且只能通过 PHP 中的 increment 运算符实现。
首先我们将$i
设置为零;
其次,我们检查并增加 $i
以确保它等于或大于自身,同时小于或等于 10。
第三,我们什么都不做......真的没有意义......
但是,普通人会写同样的东西:
for ($i = 0; $i <= 10; $i++);
echo $i;
你必须想出一个更好的用例,是的,你可以做$i = 10;
,但这并不能解释问题。
【讨论】:
以上是关于奇怪的 for 循环语法的主要内容,如果未能解决你的问题,请参考以下文章