php - 从 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 结构中得到更好的解决?
解决方案
一个好的经验法则是避免在模板中可以避免任何逻辑。要实现这样的目标,请始终以所需的确切形式为您的视图准备数据。这将使您的模板简单明了。
因此,不要采用包含所有部分数据的单个数组:
[
['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
可以将购物车数组分成上面提到的单独的数组。如果购物车数组结构有点复杂,您可能必须应用自定义函数。
推荐阅读
- ios - 无法使用“Pods-Runner/Pods-Runner-frameworks.sh: Permission denied”错误构建 Flutter
- google-sheets - 在表格/Excel 上,当 X 列中第 9 行下方的所有单元格值向下移动时,我希望 Y 列中相同行中的单元格也向下移动?
- ios - LazyVGrid 部分标题在水平滚动视图中未按预期粘贴(PinnedView)
- python - 根据python中的索引名称计算一个系列的总和
- java - 创建一个算法来排列它们以形成最大可能的整数
- java - 如何访问转储在远程 JVM 上的 hprof 文件?
- java - Java线程之间的数据交换
- google-sheets - Google 表格将多个范围合并为一个范围
- mysql - 仅当列设置了值时才连接表?
- node.js - 如何为 freebsd 打包和更新 nodejs 应用程序?