我有一个如下所示的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原理可以简单地编写此控制结构吗?
答案 0 :(得分:1)
我可能有一些语法不太正确,因为我从来没有用这种语法编写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; ?>
答案 1 :(得分:1)
我可能无法提供最优化的代码,但是这种代码结构确实可以为您提供帮助。尝试执行此操作,而不是每行应用<?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
答案 2 :(得分:0)
您可以做的是编写一个对可迭代对象执行foreach
循环的函数,该可迭代对象通过参数传递给函数,该参数将每个项目放入数组中,然后返回该数组。现在,您可以将每个项目作为数组元素进行访问。例如...
$itemArr = outputArr(array)
$itemArr[0]
您明白了!
答案 3 :(得分:0)
好,我已经通过结合@ 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; ?>