Използвам техниката „четене напред“ за обработка на вложени цикли. Това означава, че циклите „foreach“ не могат да се използват, тъй като следващият запис трябва да бъде прочетен веднага след като текущият бъде обработен. По принцип последното действие, което правите в цикъла, е четене на следващия запис, докато го настройвате за следващата итерация. Имайте предвид, че никога не тествате кога да отпечатате запис, тъй като това се решава от структурата на групите. Кодовите цикли са същите като структурата на групите в данните
„Група“ е всички записите със същия id .
Предполагам, че „съдържание“ и „действие“ са идентични за всеки запис в групата.
Редактирано за добавяне на атрибути „rowspan“ към съответните тагове „td“. Подозирам, че css може да е по-лесен на този етап.
Проблемът е, че групата не може да се покаже, докато не се знае колко записа има в нея.
И така, аз „буферирам“ всички записи, принадлежащи към група в масив. в края на групата се показва със съответните атрибути „rowspan“ в html.
Тестван е на PHP 5.3.18. Той включва тестови данни.
<?php /* Q24028866 */
$testData = array(array('id' => 2, 'date' => '05/13/2014', 'content' => 'some contents 2', 'act' => 'act1 act2 act3'),
array('id' => 2, 'date' => '05/28/2014', 'content' => 'some contents 2', 'act' => 'act1 act2 act3'),
array('id' => 7, 'date' => '06/04/2014', 'content' => 'some contents 7', 'act' => 'act1 act2 act3'),
array('id' => 8, 'date' => '06/08/2014', 'content' => 'some contents 8', 'act' => 'act1 act2 act3'),
array('id' => 8, 'date' => '06/09/2014', 'content' => 'some contents 8', 'act' => 'act1 act2 act3'));
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<table border='1'>
<thead><th>Date</th><th>Content</th><th>Act</th></thead>
<?php
// use 'read ahead' so there is always a 'previous' record to compare against...
$iterContents = new \ArrayIterator($testData);
$curEntry = $iterContents->current();
while ($iterContents->valid()) { // there are entries to process
$curId = $curEntry['id'];
// buffer the group to find out how many entries it has...
$buffer = array();
$buffer[] = $curEntry;
$iterContents->next(); // next entry - may be same or different id...
$curEntry = $iterContents->current();
while ($iterContents->valid() && $curEntry['id'] == $curId) { // process the group...
$buffer[] = $curEntry; // store all records for a group in the buffer
$iterContents->next(); // next entry - may be same or different id...
$curEntry = $iterContents->current();
}
// display the current group in the buffer...
echo '<tr>';
echo '<td>', $buffer[0]['date'], '</td>';
$rowspan = count($buffer) > 1 ? ' rowspan="'. count($buffer) .'"' : '';
echo '<td', $rowspan, '>', $buffer[0]['content'], '</td>',
'<td', $rowspan, '>', $buffer[0]['act'], '</td>';
echo '</tr>';
for($i = 1; $i < count($buffer); $i++) {
echo '<tr><td>', $buffer[$i]['date'], '</td>';
echo '</tr>';
}
} ?>
</table>
</body>
</html>