【问题标题】:endforeach in loops?循环中的endforeach?
【发布时间】:2011-06-03 18:42:25
【问题描述】:

我在使用 foreach 循环时使用括号。 endforeach 有什么用?

【问题讨论】:

    标签: php loops foreach if-statement


    【解决方案1】:

    这是alternative syntax的结束语句:

    foreach ($foo as $bar) :
        ...
    endforeach;
    

    如果您要脱离 PHP,有助于使代码更具可读性:

    <?php foreach ($foo as $bar) : ?>
        <div ...>
            ...
        </div>
    <?php endforeach; ?>
    

    【讨论】:

    • 使用替代语法编写它有什么好处?
    • @Fahad 如果您要脱离 PHP,有助于使代码更具可读性
    【解决方案2】:

    这只是一种不同的语法。而不是

    foreach ($a as $v) {
        # ...
    }
    

    你可以这样写:

    foreach ($a as $v):
        # ...
    endforeach;
    

    它们的功能完全相同;这只是风格问题。 (就我个人而言,我从未见过有人使用第二种形式。)

    【讨论】:

    • 第二种形式在模板中使用 PHP 时使用得更多,其中有 95% 的 HTML 和少量的 PHP 控制结构和echos。
    • 就我个人而言,我从未见过有人使用# 作为 PHP 中的注释运算符... ;-)
    • @Matthew,那么,第二种形式的优势是什么?我不明白。对我来说,使用{..} 似乎更简单
    • @Cyber​​Junkie:我不知道&lt;?php } ?&gt; 正在关闭什么。
    • @deceze, # 是 PHP 中散布的替代语法的另一个示例。讨厌它!
    【解决方案3】:

    作为替代语法,您可以像这样编写 foreach 循环

    foreach($arr as $item):
        //do stuff
    endforeach;
    

    这种类型的语法通常在 php 被用作模板语言时使用

    <?php foreach($arr as $item):?>
        <!--do stuff -->
    <?php endforeach; ?>
    

    【讨论】:

      【解决方案4】:

      这主要是为了在循环中创建 HTML 时可以使 start 和 end 语句更清晰:

      <table>
      <? while ($record = mysql_fetch_assoc($rs)): ?>
          <? if (!$record['deleted']): ?>
              <tr>
              <? foreach ($display_fields as $field): ?>
                  <td><?= $record[$field] ?></td>
              <? endforeach; ?>
              <td>
              <select name="action" onChange="submit">
              <? foreach ($actions as $action): ?>
                  <option value="<?= $action ?>"><?= $action ?>
              <? endforeach; ?>
              </td>
              </tr>
          <? else: ?>
               <tr><td colspan="<?= array_count($display_fields) ?>"><i>record <?= $record['id'] ?> has been deleted</i></td></tr>
          <? endif; ?>
      <? endwhile; ?>
      </table>
      

      <table>
      <? while ($record = mysql_fetch_assoc($rs)) { ?>
          <? if (!$record['deleted']) { ?>
              <tr>
              <? foreach ($display_fields as $field) { ?>
                  <td><?= $record[$field] ?></td>
              <? } ?>
              <td>
              <select name="action" onChange="submit">
              <? foreach ($actions as $action) { ?>
                  <option value="<?= $action ?>"><?= action ?>
              <? } ?>
              </td>
              </tr>
          <? } else { ?>
               <tr><td colspan="<?= array_count($display_fields) ?>"><i>record <?= $record['id'] ?> has been deleted</i></td></tr>
          <? } ?>
      <? } ?>
      </table>
      

      希望我的示例足以证明,一旦您有多层嵌套循环,并且所有 PHP 打开/关闭标签和包含的 HTML 都会取消缩进(也许您必须以某种方式缩进 HTML以您想要的方式获取您的页面),alternate syntax (endforeach) 表单可以让您的大脑更容易解析。使用正常样式,结束 } 可以自己留下,很难分辨他们实际结束的内容。

      【讨论】:

      • 如果你有括号匹配,那么我发现即使在大量 HTML 中也更容易看到 {}。虽然对设计师来说可能更容易,但大多数工具都支持突出显示的括号匹配。
      • 同意,@phazei,如果您没有使用与括号匹配的编辑器,则说明您使用了错误的编辑器。
      • 好答案。我提倡在模板中使用替代形式。它更干净,与注入的语言冲突更少。依靠 IDE 让凌乱的代码更具可读性是不可接受的。最终,尽管我总是将这场辩论视为支撑辩论的延伸,并且这种替代形式大致相当于 Allman 风格en.wikipedia.org/wiki/Indent_style#Allman_style,它呈现的代码块与眼睛平衡。如果您不了解或不了解 Allman 的好处,您可能也不会从中受益。
      • 我认为您错过了 $action 变量中的美元符号,该变量将值输出到浏览器。这里最后一个action应该是$action&lt;option value="&lt;?= $action ?&gt;"&gt;&lt;?= action ?&gt;
      【解决方案5】:

      这个怎么样?

      <ul>
      <?php while ($items = array_pop($lists)) { ?>
          <ul>
          <?php foreach ($items as $item) { ?>
              <li><?= $item ?></li>
          <?php
          }//foreach
      }//while ?>
      

      我们仍然可以使用更广泛使用的大括号,同时提高可读性。

      【讨论】:

        【解决方案6】:

        怎么样?

        <?php
            while($items = array_pop($lists)){
                echo "<ul>";
                foreach($items as $item){
                    echo "<li>$item</li>";
                }
                echo "</ul>";
            }
        ?>
        

        【讨论】:

        • 通常您的 IDE 不会识别字符串包含 HTML,并且不会警告不匹配的标签。
        【解决方案7】:

        使用foreach: ... endforeach; 不仅使内容可读,而且还使内存负载最小,如 PHP 文档中介绍的那样 所以对于大型应用来说,接收大量用户这将是最好的解决方案

        【讨论】:

          猜你喜欢
          • 2016-11-16
          • 2014-08-02
          • 1970-01-01
          • 1970-01-01
          • 2021-05-28
          • 2013-11-05
          • 2011-10-18
          • 2020-05-15
          • 2013-10-01
          相关资源
          最近更新 更多