使用嵌套的 foreach 编写此 if-else 的更简单方法

Simpler way to write this if-else with nested foreach

我有一个 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 原则编写此控制结构?

你可以做的是编写一个函数,在通过参数传递给函数的可迭代对象上执行 foreach 循环,将每个项目放入数组中,然后 returns阵列。现在您可以将每个项目作为数组元素进行访问。例如...

$itemArr = outputArr(array)
$itemArr[0]

你懂的!

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

我可能无法提供最优化的代码,但这种代码结构确实可以帮助您。不要每行应用 <?php .... ?>,试试这个..

<?php 
  if(isset($section->subsection)){
    foreach ($section->subsection as $subsection) {
      echo "
      <div class='subsection'>
        <h3>" . $subsection->category . "</h3>
        <div class='item-list'>";
        foreach ($subsection->item as $item) {
          echo "
          <div class='item'>
            <span class='item-aside'>" . $item->aside . "</span>
            <h4 class='item-name'>" . $item->name . "</h4>
            <p class='item-desc'>" . $item->description . "</p>
          </div>";
        }
        echo "</div></div>";

    }
  }else{
    echo "<div class='item-list'>";
       foreach ($section->item as $item) {
         echo "
         <div class='item'>
           <span class='item-aside'>" . $item->aside . "</span>
           <h4 class='item-name'>" . $item->name . "</h4>
           <p class='item-desc'> " . $item->description . "</p>
         </div>";
      }
       echo "</div>";
  }
?>

您可以通过删除新行来缩小代码。我只是认为如果我在 echo 中添加一些新行,它会更具可读性。 :D

好的,我结合@mike.k的函数原理和@Alvin的语法搞定了:

<?php function show_items($section){
    echo "<div class='item-list'>";
    foreach ($section->item as $item) {
        echo "<div class='item'>
                <span class='item-aside font-italic'>" . $item->aside . "</span>
                <h4 class='item-name'>" . $item->name . "</h4>
                <p class='item-desc'> " . $item->description . "</p>
            </div>";
    }
    echo "</div>";
}; ?>
<?php if(isset($section->subsection)): ?>
    <?php foreach ($section->subsection as $section) : ?>
        <div class="subsection">
            <h3 class="text-center my-3"><?= $section->category ?></h3>
            <?php show_items($section); ?>
        </div>
    <?php endforeach; ?>
<?php else: ?>
    <?php show_items($section); ?>
<?php endif; ?>