Требования: Показать «вложенные группы» в последовательном потоке записей.Здесь у нас есть вложенная группа, обозначенная полем «Заголовок».
Входные записи должны быть отсортированы так, чтобы все записи в каждой группе были вместе и в требуемом порядке.
Теперь первая мысль - использовать цикл «foreach».Это не самый ясный подход, потому что вы не можете определить конец группы, посмотрев на текущую запись.Кроме того, цикл foreach читает следующую запись в конце цикла.Итак, вы заканчиваете тем, что пытаетесь понять, где находитесь в группе, чтобы знать, что делать.
Я использую технику под названием «читать вперед».Идея состоит в том, чтобы прочитать запись перед циклом и прочитать следующую запись сразу после обработки текущей.Суть в том, что вы обрабатываете все записи в группе внутри цикла.
Итак, логика представляет собой итерацию:
- Запуск процесса группы - уже есть первая запись группы - важно.
- Обработка всех деталейзаписи, принадлежащие группе - записи читаются внутри этого цикла.
- Обрабатывает конец группы - текущая запись является первой из следующей группы
- повторяется для каждой группы.
Это облегчает понимание кода.
Я разделил все отдельные действия на функции, чтобы вы могли легко изменять отдельные действия.
Обратите внимание, что код соответствует структуреданных.В коде всегда есть одно место для ввода требуемого действия для этого конкретного элемента данных.
Запустите код
outputAllGroups($src);
exit();
Обработка всех групп
function outputAllGroups(&$inputList)
{
reset($inputList);
$currentDetails = current($inputList); // read the first record
while ($currentDetails !== false) { // not end of records
// start the title group
$currentTitle = $currentDetails->Title;
outputGroupHeader($currentDetails);
// process all records in the group
while ( $currentDetails !== false
&& $currentDetails->Title === $currentTitle) {
outputDetails($currentDetails);
$currentDetails = readNextDetails($inputList); // may end group
}
// end the title group
outputGroupFooter($currentTitle);
}
}
Функции для отдельных действий
function outputGroupHeader($details)
{
echo '<div class="TitleGroup">'. "<!-- Start Group: {$details->Title} -->". PHP_EOL
. '<div class="Title">'. $details->Title .'</div>' . PHP_EOL;
}
function outputGroupFooter($title)
{
echo '</div>'. "<!-- End Group: {$title} -->". PHP_EOL;
}
function outputDetails($details)
{
echo '<div class="details">'. PHP_EOL,
$details->Info . PHP_EOL,
$details->ImageURL .PHP_EOL,
'</div>' . PHP_EOL;
}
function readNextDetails(&$inputList)
{
$allOk = next($inputList); // advance next
return $allOk !== false ? current($inputList) : $allOk; // advance next
}
Вывод
<div class="TitleGroup"><!-- Start Group: Image -->
<div class="Title">Image</div>
<div class="details">
info1
url1.jpg
</div>
<div class="details">
info2
url2.jpg
</div>
</div><!-- End Group: Image -->
<div class="TitleGroup"><!-- Start Group: Accommodation -->
<div class="Title">Accommodation</div>
<div class="details">
info3
image3.jpg
</div>
<div class="details">
info4
image4.jpg
</div>
<div class="details">
info5
image5.jpg
</div>
</div><!-- End Group: Accommodation -->
<div class="TitleGroup"><!-- Start Group: Image -->
<div class="Title">Image</div>
<div class="details">
info6
image6.jpg
</div>
</div><!-- End Group: Image -->
<div class="TitleGroup"><!-- Start Group: Location -->
<div class="Title">Location</div>
<div class="details">
info7
image7.jpg
</div>
</div><!-- End Group: Location -->
Данные
$src = Array (
'0' => (object) array(
'Title' => 'Image',
'Info' => 'info1',
'ImageURL' => 'url1.jpg', ),
'1' => (object) array(
'Title' => 'Image',
'Info' => 'info2',
'ImageURL' => 'url2.jpg', ),
'2' => (object) array(
'Title' => 'Accommodation',
'Info' => 'info3',
'ImageURL' => 'image3.jpg', ),
'3' => (object) array(
'Title' => 'Accommodation',
'Info' => 'info4',
'ImageURL' => 'image4.jpg', ),
'4' => (object) array(
'Title' => 'Accommodation',
'Info' => 'info5',
'ImageURL' => 'image5.jpg', ),
'5' => (object) array(
'Title' => 'Image',
'Info' => 'info6',
'ImageURL' => 'image6.jpg', ),
'6' => (object) array(
'Title' => 'Location',
'Info' => 'info7',
'ImageURL' => 'image7.jpg', ),
);