циклы — PHP: наилучшая практика с повторяющимися строками кода без четкого ввода / вывода (DRY)

у меня есть HMVC веб-приложение разработано на PHP.

В моем контроллере и на мой взгляд, мне нужно перебрать несколько массивов. Между итерациями мне нужно использовать / echo некоторые значения из массива. Проблема в том, что в моем коде беспорядок, и мне было интересно, есть ли лучшие передовые практики для создания таких циклов.

Для следующих примеров: $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;

}

}

Мои мысли

  1. Моей первой мыслью было, так как итерации в контроллере и представлении совпадают, перенести это в отдельную функцию, где ввод будет $headers а также $groups, но какой будет выход? В представлении мне нужны некоторые значения массива между кодом HTML и в контроллере, мне нужно сохранить их в $pdf массив.
  2. Моя вторая мысль состояла в том, чтобы создать отдельную функцию для итерации по обоим массивам, чтобы создать 3-й и 4-й массив со всеми значимыми значениями в нем. Этот 3-й и 4-й массив будет выглядеть примерно так:

    $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?

0

Решение

извините за мой слишком быстрый комментарий, я не видел, что «групповой цикл» не является потомком $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) {

просто сделайте тесты, чтобы выбрать код, который займет меньше времени с вашими данными

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]