使用嵌套的 foreach 编写此 if-else 的更简单方法
Simpler way to write this if-else with nested foreach
我有一个 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 原则编写此控制结构?
你可以做的是编写一个函数,在通过参数传递给函数的可迭代对象上执行 foreach
循环,将每个项目放入数组中,然后 returns阵列。现在您可以将每个项目作为数组元素进行访问。例如...
$itemArr = outputArr(array)
$itemArr[0]
你懂的!
我可能有一些语法不太正确因为我从来没有用这种语法写过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; ?>
我可能无法提供最优化的代码,但这种代码结构确实可以帮助您。不要每行应用 <?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>";
}
?>
您可以通过删除新行来缩小代码。我只是认为如果我在 echo 中添加一些新行,它会更具可读性。 :D
好的,我结合@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; ?>
我有一个 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 原则编写此控制结构?
你可以做的是编写一个函数,在通过参数传递给函数的可迭代对象上执行 foreach
循环,将每个项目放入数组中,然后 returns阵列。现在您可以将每个项目作为数组元素进行访问。例如...
$itemArr = outputArr(array)
$itemArr[0]
你懂的!
我可能有一些语法不太正确因为我从来没有用这种语法写过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; ?>
我可能无法提供最优化的代码,但这种代码结构确实可以帮助您。不要每行应用 <?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>";
}
?>
您可以通过删除新行来缩小代码。我只是认为如果我在 echo 中添加一些新行,它会更具可读性。 :D
好的,我结合@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; ?>