у меня есть 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;
}
}
Мои мысли
$headers
а также $groups
, но какой будет выход? В представлении мне нужны некоторые значения массива между кодом HTML и в контроллере, мне нужно сохранить их в $pdf
массив.Моя вторая мысль состояла в том, чтобы создать отдельную функцию для итерации по обоим массивам, чтобы создать 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?
извините за мой слишком быстрый комментарий, я не видел, что «групповой цикл» не является потомком $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) {
просто сделайте тесты, чтобы выбрать код, который займет меньше времени с вашими данными
Других решений пока нет …