Pro zpracování vnořených smyček používám techniku „čtení dopředu“. Znamená to, že smyčky „foreach“ nelze použít, protože další záznam musí být přečten, jakmile je zpracován aktuální. V podstatě poslední akcí, kterou ve smyčce uděláte, je čtení dalšího záznamu, když jej nastavujete pro další iteraci. Všimněte si, že nikdy netestujete, kdy vytisknout záznam, protože o tom rozhoduje struktura skupin. Kódové smyčky jsou stejné jako struktura skupin v datech
„Skupina“ je vše záznamy se stejným id .
Předpokládám, že „obsah“ a „akt“ jsou u každého záznamu ve skupině totožné.
Upraveno přidáním atributů 'rowspan' do příslušných značek 'td'. Mám podezření, že css může být v tomto bodě jednodušší.
Problém je v tom, že skupinu nelze zobrazit, dokud není známo, kolik položek v ní je.
Takže „buffer“ všechny záznamy patřící do skupiny v poli. na konci skupiny se zobrazí s příslušnými atributy 'rowspan' v html.
Je testován na PHP 5.3.18. Zahrnuje testovací data.
<?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>