Более простой способ написать это if-else с вложенным foreach - PullRequest
0 голосов
/ 05 июля 2018

У меня есть структура 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 голосов
/ 05 июля 2018

Хорошо, я понял это, комбинируя принцип функции @ mike.k и синтаксис @ Элвина:

<?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; ?>
0 голосов
/ 05 июля 2018

У меня может быть некоторый синтаксис не совсем правильный , потому что я никогда не пишу 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; ?>
0 голосов
/ 05 июля 2018

Возможно, я не смогу дать наиболее оптимизированный код, но эта структура кода действительно поможет вам. Вместо применения <?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

0 голосов
/ 05 июля 2018

Что вы можете сделать, это написать функцию, которая выполняет цикл foreach для итерируемого объекта, который передается функции через аргумент, который помещает каждый элемент в массив, а затем возвращает массив. Теперь вы сможете получить доступ к каждому элементу как элементу массива. Например ...

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

Вы поняли!

...