首页 > 解决方案 > 使用嵌套 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 原则编写这个控制结构?

标签: phphtmlif-statementforeachdry

解决方案


我可能有一些语法不太正确,因为我从来没有用这种语法编写 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; ?>

推荐阅读