Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie führt man Tabellenzeilen mit PHP-Array zusammen?

Ich verwende die 'Vorauslesen'-Technik zum Verarbeiten von verschachtelten Schleifen. Dies bedeutet jedoch, dass 'foreach'-Schleifen nicht verwendet werden können, da der nächste Datensatz gelesen werden muss, sobald der aktuelle verarbeitet wurde. Grundsätzlich ist die letzte Aktion, die Sie in der Schleife ausführen, das Lesen des nächsten Datensatzes, während Sie ihn für die nächste Iteration einrichten. Beachten Sie, dass Sie niemals testen, wann ein Datensatz gedruckt werden soll, da dies von der Struktur der Gruppen bestimmt wird. Die Codeschleifen entsprechen der Struktur der Gruppen in den Daten

Eine 'Gruppe' ist alle die Datensätze mit derselben id .

Ich gehe davon aus, dass 'content' und 'act' für jeden Eintrag in der Gruppe identisch sind.

Bearbeitet, um 'rowspan'-Attribute zu den entsprechenden 'td'-Tags hinzuzufügen. Ich vermute, CSS könnte an dieser Stelle einfacher sein.

Das Problem ist, dass die Gruppe erst angezeigt werden kann, wenn bekannt ist, wie viele Einträge darin enthalten sind.

Also puffere ich alle Datensätze, die zu einer Gruppe gehören, in einem Array. am ende der gruppe wird sie mit den entsprechenden 'rowspan'-attributen im html angezeigt.

Es wurde auf PHP 5.3.18 getestet. Es enthält Testdaten.

<?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>