【问题标题】:Loop with curly brackets causes wrong output带大括号的循环导致错误输出
【发布时间】:2015-08-27 12:03:22
【问题描述】:

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

第一个例子:

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

<?php foreach ($arr as $element) ?>
<?php { ?>
    <?php echo $element; ?>
<?php } ?>

输出:

5 //Is this result wrong?

第二个例子:

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

<?php foreach ($arr as $element) { ?>
    <?php echo $element; ?>
<?php } ?>

输出:

12345

我错过了 PHP 语法的哪些方面?

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

编辑:

我知道并非每一行都需要标签。 更准确地说:我想知道为什么这两个例子给了我两个不同的结果?

【问题讨论】:

  • 我知道 :D 只是想知道这个输出的原因......
  • 只需将 放在最后.....为什么在每一行都使用它..
  • 只是猜测,但也许第一个示例中的 ?> 实际上被视为语句结尾(可以使用不带大括号的循环)。此时,循环已经发生,$element 是最后一个值。然后大括号只是作为你回显的代码块,即 5。
  • 我在某处读到一些框架实际上为每一行添加了标签。
  • @JayBlanchard 问题中没有提到框架。你在这里很安全,这是一个安全的地方:-) ...现在,muahaha

标签: php loops foreach


【解决方案1】:

根据输出,我的猜测是:

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

<?php foreach ($arr as $element) ?>
<?php { ?>
    <?php echo $element; ?>
<?php } ?>

被解释为:

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

foreach ($arr as $element);
{
    echo $element;
}
?>

看起来像是解释器中的错误? 请参阅 Rizier123 的 cmets:

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

无论如何,按照您编写的方式,代码看起来很糟糕。请选择更简洁的代码。


通读我认为Jon Stirling这个问题下的cmets最好解释这个症状:

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

【讨论】:

  • + foreach()/*Do nothing here*/; 后面的括号只是一个语句组:php.net/manual/en/control-structures.intro.php
  • 我同意什么都不做,但在这种情况下,大括号中的 $element 不应该是未知的吗?
  • @Thulur 不,1。$element 仍然存在于 foreach 循环中,并保存数组的最后一个值。 2. statement-group 没有创建新的变量作用域,意味着$element 是众所周知的,也没有超出作用域。
  • @Thulur 试试这个&lt;?php $var = 'hello'; {echo $var;} ?&gt;
  • @Thulur ^^ 语句组和 foreach 循环都没有创建新的变量范围。代码中的所有内容都在同一个变量范围内。
【解决方案2】:

过度使用&lt;? php&gt; 是你的问题。

您在输出结果之前完成了foreach 上下文,而第二次没有这样做。

仔细查看您的示例,您应该会发现自己的做法有所不同。

【讨论】:

    【解决方案3】:

    我不知道你为什么使用这么多 php 标签,但这就是为什么它不起作用! 试试这个:

    <?php $arr = array(1,2,3,4,5);
    
    foreach ($arr as $element)
    {
        echo $element;
    } ?>
    

    【讨论】:

    • 不是 OP 所要求的。他问为什么在新行中使用 { 会导致不同的行为。
    【解决方案4】:

    您不需要在每一行都使用&lt;?php?&gt;,只需这样做:

    <?php
    $arr = array(1,2,3,4,5);
    
    foreach ($arr as $element) {
    echo $element;
    }
    ?>
    

    或替代语法:

    <?php
    $arr = array(1,2,3,4,5);
    
    foreach ($arr as $element)
    {
    echo $element;
    }
    ?>
    

    或者

    <?php
    $arr = array(1,2,3,4,5);
    
    foreach ($arr as $element):
    echo $element;
    endforeach;
    ?>
    

    当你这样做时:

    <?php foreach ($arr as $element) ?>
    <?php { ?>
        <?php echo $element; ?>
    <?php } ?>
    

    PHP 什么都不循环,因为它看到了

    foreach ($arr as $element)
    {
    }
    echo $element;
    

    【讨论】:

    • 这是真的,你不需要它。但这仍然不能回答 OP 的问题。
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多