Tôi sử dụng kỹ thuật 'đọc trước' để xử lý các vòng lặp lồng nhau. Điều đó có nghĩa là không thể sử dụng vòng lặp 'foreach' vì bản ghi tiếp theo phải được đọc ngay sau khi bản ghi hiện tại đã được xử lý. Về cơ bản, hành động cuối cùng bạn thực hiện trong vòng lặp là đọc bản ghi tiếp theo khi bạn đang thiết lập nó cho lần lặp tiếp theo. Lưu ý, bạn không bao giờ kiểm tra thời điểm in bản ghi vì điều đó được quyết định bởi cấu trúc của các nhóm. Các vòng lặp mã giống như cấu trúc của các nhóm trong dữ liệu
Một 'nhóm' là tất cả các bản ghi có cùng id .
Tôi giả định rằng 'nội dung' và 'hành động' giống hệt nhau cho mỗi mục trong nhóm.
Đã chỉnh sửa để thêm thuộc tính 'rowspan' vào các thẻ 'td' thích hợp. Tôi nghi ngờ css có thể dễ dàng hơn vào thời điểm này.
Vấn đề là nhóm không thể được hiển thị cho đến khi biết có bao nhiêu mục nhập trong đó.
Vì vậy, tôi 'đệm' tất cả các bản ghi thuộc một nhóm trong một mảng. ở cuối nhóm, nó được hiển thị với các thuộc tính 'rowspan' thích hợp trong html.
Nó được thử nghiệm trên PHP 5.3.18. Nó bao gồm dữ liệu thử nghiệm.
<?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>