首页 > 解决方案 > 从 PHP 中的单个循环回显到分离的 html 部分

问题描述

在处理必须回显到单独的 html 部分的循环时,PHP 中的常见模式是什么?

考虑我有一个 cart() 函数,它将产品项目作为数组返回。例如一个产品:

$aProduct = ['details' => 'this details', 'frames' => 2, 'price' => 58]

现在我必须遍历 cart()在不同的 html 部分中回显每个产品的数据。


  <section class="details">
    //each product's details
  </section>

  <section class="frames">
    // each product's frames
  </section>

  <section class="price">
    // each product's price
  </section>

...将整个结构封闭在一个循环中很简洁,但会复制不需要的部分:

<?php foreach(cart() as $product): ?>

  <section class="details">
    <?= $product['details'] ?>
  </section>

  <section class="frames">
    <?= $product['frames'] ?>
  </section>

  <section class="price">
    <?= $product['price'] ?>
  </section>

<?php endforeach ?>

...似乎唯一的选择是在每个部分中复制循环:

  <section class="details">
    <?php foreach(cart() as $product): ?>
      <?= $product['details'] ?>
    <?php endforeach ?>
  </section>

  <section class="frames">
    <?php foreach(cart() as $product): ?>
      <?= $product['frames'] ?>
    <?php endforeach ?>
  </section>

  <section class="price">
    <?php foreach(cart() as $product): ?>
      <?= $product['price'] ?>
    <?php endforeach ?>
  </section>

...但这既是重复的,并且当数据变得更复杂时可能会使事情变得困难,例如嵌套数组,其元素需要在部分之间同步弹出。

在这种情况下是否有任何 PHP 替代方案、最佳实践或常见模式,或者这可能在 HTML 结构中得到更好的解决?

标签: phphtmlloops

解决方案


一个好的经验法则是避免在模板中可以避免任何逻辑。要实现这样的目标,请始终以所需的确切形式为您的视图准备数据。这将使您的模板简单明了。

因此,不要采用包含所有部分数据的单个数组:

[
    ['details' => 'this details', 'frames' => 2, 'price' => 58],
    ['details' => 'those details', 'frames' => 4, 'price' => 69],
    ['details' => 'that details', 'frames' => 6, 'price' => 93],
]

并多次迭代它只是为了得到你需要的分数,你应该把它分成几个数组来保存一个部分的所有细节,所以你最终会得到这样的结果:

$details = ['this details', 'those details', 'that details'];
$frames = [2, 4, 6];
$prices = [58, 69, 93];

之后,每个部分的输出都是微不足道的。

这个例子很简单,array_column可以将购物车数组分成上面提到的单独的数组。如果购物车数组结构有点复杂,您可能必须应用自定义函数。


推荐阅读