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

时间:2018-07-05 00:59:48

标签: php html if-statement foreach dry

我有一个如下所示的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原理可以简单地编写此控制结构吗?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我可能无法提供最优化的代码,但是这种代码结构确实可以为您提供帮助。尝试执行此操作,而不是每行应用<?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>";
  }
?>

您可以通过删除新行来缩小代码。我只是认为,如果在回显中放入一些新行,它将更具可读性。 :D

答案 2 :(得分:0)

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

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

您明白了!

答案 3 :(得分:0)

好,我已经通过结合@ 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; ?>