首页 > 解决方案 > 处理开放且格式正确的 PHP 循环

问题描述

对 PHP 非常陌生,并且知道一点 HTML。

所有这些问题都源于作者的编码风格。这看起来很有趣,但是代码的工作方式似乎没有意义。

  1. 我不明白为什么作者建议<?php ?>为 html 中的每一行单独标记。这是最好的风格/编码实践吗?

  2. 由于作者的风格,我无法理解为什么该行<li><?php echo $product['name']; ?></li>没有放入自己的 php 标签中。对我来说,“li”标签应该位于 php 标签内,然后回显出来......但是不,作者所做的工作正确地显示了内容。

  3. 因为2,我去实验下面的代码。我在文本中添加了我认为只是我希望输出一次的纯文本,而不是通过 PHP 循环。但是不......即使文本不在 PHP 代码本身中,也会发生循环。

完全糊涂了。
非常感谢任何指导。

<?php
    $products = [
        ['name' => 'shiny star', 'price' => 20],
        ['name' => 'green shell', 'price' => 10],
        ['name' => 'red shell', 'price' => 15],
        ['name' => 'gold coin', 'price' => 5],
        ['name' => 'lightning bolt', 'price' => 40],
        ['name' => 'banana skin', 'price' => 2],
    ];
?>

<... snip to show only body..>
    <body>
        <div class="">
            <ul>
                Not php section
                <?php foreach($products as $product) { ?>
                    Should be plain text with no repeat.  Inside First. Outside second.
                    <?php if ($product['price'] > 15) { ?>
                        <li><?php echo $product['name']; ?></li>
                        Should be plain text.  Inside second.
                    <?php } ?>
                <?php } ?>
            </ul>
        </div>
    </body>

输出:

不是 php 部分应该是纯文本,没有重复。内第一。外二。闪亮的星星应该是纯文本。内二。应该是没有重复的纯文本。内第一。外二。应该是没有重复的纯文本。内第一。外二。应该是没有重复的纯文本。内第一。外二。应该是没有重复的纯文本。内第一。外二。闪电应该是纯文本。内二。应该是没有重复的纯文本。内第一。外二。

标签: phphtml

解决方案


我遵循的一般规则是只将 PHP 标记包装在尽可能小的东西周围。

因此,对于示例,不需要回显 HTML 标记,它只是需要它的变量和循环,所以我会采用类似的样式。

考虑它的一种方法是将 PHP 标记之外的文本视为隐式回显。

这可能更好地解释了为什么 3 号会绊倒你。“应该是没有重复的纯文本......”位于 foreach 循环的左大括号和右大括号之间,因此将被重复。

所以它相当于这样的事情,显然会重复:

<?php
  foreach($products as $product) {
    echo "Should be plain text with no repeat.  Inside First. Outside second.";
    // ... the rest
  }
?>

正如@OsDev 在评论中提到的,当以这种方式使用 PHP 作为模板语言时,使用替代语法也很常见,这使得在没有正确缩进的情况下更容易阅读。(if/while/for/foreach/switch 都有替代的语法版本)

我还建议研究模板语言,例如Twig(Symfony 框架)Blade(Laravel 框架),它们是在现代 PHP 中穿插 PHP 和标记的更现代方式


推荐阅读