PHP:重复代码行而没有明确的输入/输出(DRY)的最佳实践


PHP: Best practice with repeating lines of code without a clear input/output (DRY)

我有一个用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>
  1. 我的第一个想法是,由于控制器和视图中的迭代是相同的,将其移动到一个单独的函数,其中输入将是$headers$groups,但输出将是什么?在视图中,我需要一些HTML代码之间的数组值,在控制器中,我需要将它们保存在$pdf数组。
  2. 我的第二个想法是创建一个单独的函数来迭代两个数组,以创建第三和第四个数组,其中包含所有重要值。第三和第四个数组看起来像这样:

    $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) {

只是做基准测试,以选择哪些代码花费更少的时间与您的数据