带大括号的循环导致输出错误

Thu*_*lur 6 php foreach loops

我创建了两个简单的例子:

第一个例子:

<?php $arr = array(1,2,3,4,5); ?>

<?php foreach ($arr as $element) ?>
<?php { ?>
    <?php echo $element; ?>
<?php } ?>
Run Code Online (Sandbox Code Playgroud)

输出:

5 //Is this result wrong?
Run Code Online (Sandbox Code Playgroud)

第二个例子:

<?php $arr = array(1,2,3,4,5); ?>

<?php foreach ($arr as $element) { ?>
    <?php echo $element; ?>
<?php } ?>
Run Code Online (Sandbox Code Playgroud)

输出:

12345
Run Code Online (Sandbox Code Playgroud)

我错过了什么PHP语法?

我知道有一种替代的foreach语法,但在我看来,两个显示的示例都应该产生相同的输出.(使用PHP版本进行代码测试:5.6.12)

编辑:

我知道每行都不需要标签.更确切地说:我想知道为什么这两个例子给我2个不同的结果?

Mon*_*eus 5

根据输出,我的猜测是:

<?php $arr = array(1,2,3,4,5); ?>

<?php foreach ($arr as $element) ?>
<?php { ?>
    <?php echo $element; ?>
<?php } ?>
Run Code Online (Sandbox Code Playgroud)

被解释为:

<?php
$arr = array(1,2,3,4,5);

foreach ($arr as $element);
{
    echo $element;
}
?>
Run Code Online (Sandbox Code Playgroud)

看起来像翻译中的错误?请参阅Rizier123的评论:

  1. 不是错误:stackoverflow.com/q/29284075/3933332
  2. foreach之后的括号()/ 这里什么都不做 /; 只是一个声明组:php.net/manual/en/control-structures.intro.php

无论如何,代码看起来很糟糕.请选择更干净的代码.


通过阅读问题的评论,我认为Jon Stirling最好地解释了这个症状:

只是猜测,但第一个例子中的?>实际上可能被视为语句结束(循环可以不使用大括号).此时,循环已经发生,$ element是最后一个值.然后大括号只是作为你回显的代码块,即5.

  • +`foreach()/*后面的括号*/;`只是一个声明组:http://php.net/manual/en/control-structures.intro.php (3认同)
  • @Thulur不,1.$ element`仍然存在于foreach循环中并保存数组的最后一个值.2.语句组不创建新的变量范围,意味着`$ element`是众所周知的,也不在范围之外. (2认同)
  • @Thulur ^^语句组和foreach循环都不会创建新的变量范围.代码中的所有内容都在同一个变量范围内. (2认同)