我有一个用PHP开发的HMVC web应用程序。
在我的控制器和视图中,我需要迭代多个数组。在迭代之间,我需要使用/回显数组中的一些值。问题是我的代码很乱,我想知道是否有更好的最佳实践来做这种循环。
举例如下:$header
有15个值,$groups
有1000个值
我的视图中有以下(简化的)代码示例:
<? foreach($headers as $header) { ?>
<div class="header"><?= $header->number ?></div>
<? $i = 0; ?>
<? foreach($groups as $group) { ?>
<? $part_letter = $group->part->letter ?>
<? if ($group->number !== $header->number) { continue; } ?>
<? $i++; ?>
<? if ($i === 1) { $first_group = true; } else { $first_group = false; } ?>
<div class="<?= $first_group ? 'colored' : ''>
<?= echo $group->name ?>
<?= echo $part_letter ?>
</div>
<? } ?>
<? } ?>
我有以下(简化)的代码示例在我的控制器:
foreach($headers as $header) {
$pdf[] = $header->number;
$i = 0;
foreach($groups as $group) {
$part_letter = $group->part->letter;
if ($group->number !== $header->number) { continue; }
$i++;
if ($i === 1) { $first_group = true; } else { $first_group = false; }
$pdf['first_group'] = $first_group;
$pdf['group_name'] = $group->name;
$pdf['part_letter'] = $part_letter;
}
}
<<p> 我的想法/strong> - 我的第一个想法是,由于控制器和视图中的迭代是相同的,将其移动到一个单独的函数,其中输入将是
$headers
和$groups
,但输出将是什么?在视图中,我需要一些HTML代码之间的数组值,在控制器中,我需要将它们保存在$pdf
数组。 我的第二个想法是创建一个单独的函数来迭代两个数组,以创建第三和第四个数组,其中包含所有重要值。第三和第四个数组看起来像这样:
$header_values[$id] = $number; $group_values[$id] = array($part_letter, $group_equals_header_number, $is_first_group);
那么我的控制器将是这样的:
foreach($header_values as $header_value) { $pdf[] = $header_value; foreach($group_values as $group_value) { if (!$group_value['group_equals_header_number']) { continue; } $pdf['first_group'] = $group_value['is_first_group']; $pdf['group_name'] = $group_value['group_name']; $pdf['part_letter'] = $group_value['part_letter']; } }
我的视图是这样的:
<? if (!$group_value['group_equals_header_number']) { continue; } ?> <div class="<?= $group_value['is_first_group'] ? 'colored' : ''> <?= echo $group_value['group_name'] ?> <?= echo $group_value['part_letter'] ?> </div>
它看起来好一点,缺点是我需要额外的迭代。
这种重复循环/重复代码的最佳实践是什么,同时保持我的代码DRY?
抱歉我的评论太快了,我没有看到"group loop"不是$header
的子循环,那么在这种情况下,如果你在不同的头中有很多头和很多组,你可以浪费时间
你可以试试这段代码,它会为第一个任务使用更多的时间,但它会为第二个任务节省更多的时间
<?php
////////////////////////////////////////////////////
// *** first task : grouping "groups" by header
$listHeaders = [];
// searching all the headers numbers
foreach ($headers as $header)) {
$listHeaders[$header->number] = $header;
}
// associating groups with header
foreach ($groups as $group) {
$headerNumber = $group->number;
if (!isset($listHeaders[$headerNumber])) {
continue;
}
if (!isset($listHeaders[$headerNumber]->listGroups)) {
$listHeaders[$headerNumber]->listGroups = [];
}
$listHeaders[$headerNumber]->listGroups[] = $group;
}
////////////////////////////////////////////////////
// *** second task : display
foreach ($listHeaders as $headerNumber => $header) {
?>
<div class="header">
<?php echo $headerNumber;?>
</div>
<?php
foreach ($header->listGroups as $index => $group) {
?>
<div class="<?php echo (0 !== $index) ? "" : "colored";?>">
<?php echo $group->name;?>
<?php echo $group->part->letter;?>
</div>
<?php
} // END foreach ($header->listGroups as $index => $group) {
} // END foreach ($listHeaders as $headerNumber => $header) {
只是做基准测试,以选择哪些代码花费更少的时间与您的数据