【问题标题】:Simpler way to write this if-else with nested foreach使用嵌套 foreach 编写此 if-else 的更简单方法
【发布时间】:2018-12-13 09:32:26
【问题描述】:

我有一个如下所示的 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; ?>

正如您所看到的,这段代码的一部分基本上是重复的,&lt;div class="item-list"&gt; 中的所有内容几乎完全相同,但写在两个不同的地方。有没有更简单的方法可以按照 DRY 原则编写这个控制结构?

【问题讨论】:

    标签: php html if-statement foreach dry


    【解决方案1】:

    我可能无法给出最优化的代码,但这种代码结构确实会对您有所帮助。而不是每行应用&lt;?php .... ?&gt;,试试这个..

    <?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

    【讨论】:

    • 是的,我想我将不得不在将要调用的函数中至少部分使用这种语法。
    • 谢谢!如果它有帮助,请给它一个upvote。这样它仍然可以帮助其他用户。 :)
    【解决方案2】:

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

    【讨论】:

    • 不幸的是,该语法仅适用于控制结构(if、while、for、foreach 和 switch),但这基本上是我已经在考虑的。我必须将它与@AlvinChing 的语法结合起来
    • 谢谢@Aender,我根据你的cmets修改了它
    【解决方案3】:

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

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

    你懂的!

    【讨论】:

    • 但是他仍然需要一个for循环来循环数据并输出两次。
    • @Mehdi 不,他不会将函数的输出保存到变量($itemArr)然后引用该数组中的项目($itemArr[0],...,$itemArr[22]等)他需要的任何地方......
    • 但是如果项目的计数是动态的呢?
    • @Mehdi 是动态计数吗?如果是这样的话,你可以参考像$itemArr[count($itemArr)] 这样的项目,即使它不会让你走得太远。你可以在函数或其他地方编写其他代码来处理这个问题,而无需编写更多循环......
    【解决方案4】:

    好的,结合@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; ?>
    

    【讨论】:

      猜你喜欢
      • 2017-01-14
      • 2022-06-19
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      相关资源
      最近更新 更多