sql >> Databasteknik >  >> RDS >> Mysql

Hur slår man samman tabellrad med PHP-array?

Jag använder "läs framåt"-tekniken för att bearbeta kapslade loopar. Det betyder att "foreach"-slingor inte kan användas eftersom nästa post måste läsas så snart den aktuella har bearbetats. I grund och botten är den sista åtgärden du gör i loopen att läsa nästa post när du ställer in den för nästa iteration. Observera att du aldrig testar när en post ska skrivas ut eftersom det bestäms av gruppernas struktur. Kodslingorna är desamma som strukturen för grupperna i datan

En "grupp" är alla posterna med samma id .

Jag antar att "innehållet" och "akten" är identiska för varje post i gruppen.

Redigerat för att lägga till "rowspan"-attribut till lämpliga "td"-taggar. Jag misstänker att css kan vara lättare vid det här laget.

Problemet är att gruppen inte kan visas förrän det är känt hur många poster som finns i den.

Så jag "buffrar" alla poster som tillhör en grupp i en array. i slutet av gruppen visas den med lämpliga "rowspan"-attribut i html.

Den är testad på PHP 5.3.18. Den innehåller testdata.

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


  1. ACCEPT-sats i Oracle PL SQL

  2. Hur man skapar en synonym i mysql

  3. Hur man skriver flera kolumner i klausul med sqlalchemy

  4. PostgreSQL - Tom tabell