如何重构类似的 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>");
如果您有多个数组的 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>");