如何重构类似的 foreach 循环以遵循 DRY 方法

How to refactor similar foreach loops to follow DRY approach

如果您有多个数组的 foreach 循环,并且您需要 运行 其中一个在另一个数组中 - 是否可以将以下代码重构为只有一个循环来停止重复代码:

<?php

$apples = array(
    'red',
);

$bananas = array(
    'yellow',
);

foreach ( $apples => $apple ) {
    echo '<div class="apple">' . $apple . '</div>';
}

foreach ( $bananas => $banana ) {
    echo '<div class="banana">';
    echo $banana;
    echo '<div class="child">';
        foreach ( $apples => $apple ) {
            echo '<div class="apple">' . $apple . '</div>';
        }
    echo '</div>';
    echo '</div>';
}

/*
 output: 
 <div class="apple">red</div>
 <div class="banana">
   yellow
    <div class="child">
        <div class="apple">red</div>
    </div>
 </div>
 */

这个重复的代码逻辑是输出 <div class="apple">red</div>:

foreach ( $apples => $apple ) {
    echo '<div class="apple">' . $apple . '</div>';
}

我不确定在没有提供更好的上下文的情况下是否有很大改进,但使用函数生成列表应该有助于减少重复代码。

<?php

$apples = array(
    'red',
);

$bananas = array(
    'yellow',
);


function getFruitListHTML(array $fruitList, string $class, string $child = ''): string {
    $out = '';
    foreach ( $fruitList as $fruitItem ) {
        $out .= "<div class=\"$class\">";
        $out .= $fruitItem;
        $out .= $child;
        $out .= '</div>';
    }
    return $out;
}

$applesHTML = getFruitListHTML($apples, 'apple');
echo $applesHTML;
echo getFruitListHTML($bananas, 'banana', "<div class=\"child\">$applesHTML</div>");