php - 使用嵌套 foreach 编写此 if-else 的更简单方法
问题描述
我有一个看起来像这样的 PHP 结构:
<?php if(isset($section->subsection)): ?>
<?php foreach ($section->subsection as $subsection) : ?>
<div class="subsection">
<h3><?= $subsection->category ?></h3>
<div class="item-list">
<?php foreach ($subsection->item as $item) : ?>
<div class="item">
<span class="item-aside"><?php echo $item->aside; ?></span>
<h4 class="item-name"><?php echo $item->name; ?></h4>
<p class="item-desc"><?php echo $item->description; ?></p>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
<?php else: ?>
<div class="item-list">
<?php foreach ($section->item as $item) : ?>
<div class="item">
<span class="item-aside"><?php echo $item->aside; ?></span>
<h4 class="item-name"><?php echo $item->name; ?></h4>
<p class="item-desc"><?php echo $item->description; ?></p>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
如您所见,这段代码的一部分基本上是重复的,其中的所有内容<div class="item-list">
几乎完全相同,但写在两个不同的地方。有没有更简单的方法可以按照 DRY 原则编写这个控制结构?
解决方案
我可能有一些语法不太正确,因为我从来没有用这种语法编写 PHP,但你应该明白 - 函数完成了工作,每次都用你需要的项目列表调用它。
<?php
function show_items($items) {
echo '<div class="item-list">';
foreach ($items as $item) {
echo '
<div class="item">
<span class="item-aside">' . htmlentities($item->aside) . '</span>
<h4 class="item-name">' . htmlentities($item->name) . '</h4>
<p class="item-desc">' . htmlentities($item->description) . '</p>
</div>';
echo "</div>\n";
}
?>
<?php if(isset($section->subsection)): ?>
<?php foreach ($section->subsection as $subsection) : ?>
<div class="subsection">
<h3><?= $subsection->category ?></h3>
<?php show_items($subsection->item); ?>
</div>
<?php endforeach; ?>
<?php else: ?>
<?php show_items($section->item); ?>
<?php endif; ?>
推荐阅读
- google-cloud-platform - 将 GCP 服务帐户密钥传递给 GKE pod
- java - 如何使用私有 Gitlab 存储库中的 Maven 组件?
- asp.net - 不使用带有 ForbidResult 的 URL 重定向或将数据传递到来自 ASP.NET Core 和 Identity 的帐户 AccessDenied 视图
- javascript - 如何在 JavaScript 中使用 Object 键作为标题和值子列表
- python - 将 numpy.load() 保存在内存中,与重新运行代码无关
- bash - 每 ! (感叹号)在bash
- docker - Docker-Compose Environment-Variables 空白字符串
- javascript - 使用 IndexedDB,是否可以在 window.indexedDB.open 的 onsuccess 事件中创建对象存储?
- java - Java MongoDb 获取 id 作为时间戳,但需要十六进制字符串
- r - 如何删除R中数据框列中的特定数字?