sql >> Database teknologi >  >> RDS >> Mysql

Hvordan flettes tabelrække med PHP-array?

Jeg bruger 'læs fremad'-teknikken til at behandle indlejrede løkker. Det betyder, at 'foreach'-løkker ikke kan bruges, da den næste post skal læses, så snart den nuværende er blevet behandlet. Grundlæggende er den sidste handling, du udfører i løkken, at læse den næste post, mens du sætter den op til den næste iteration. Bemærk, du tester aldrig, hvornår en post skal udskrives, da det bestemmes af gruppernes struktur. Kodesløjferne er de samme som strukturen af ​​grupperne i dataene

En 'gruppe' er alle posterne med det samme id .

Jeg antager, at 'indhold' og 'akt' er identiske for hver post i gruppen.

Redigeret for at tilføje 'rowspan'-attributter til de relevante 'td'-tags. Jeg formoder, at css kan være nemmere på dette tidspunkt.

Problemet er, at gruppen ikke kan vises, før det er kendt, hvor mange poster der er i den.

Så jeg 'buffer' alle poster, der tilhører en gruppe, i et array. i slutningen af ​​gruppen vises den med de passende 'rowspan'-attributter i html'en.

Det er testet på PHP 5.3.18. Det inkluderer 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. SQL med rang og partition

  2. Hvad er nyt i PostgreSQL 12

  3. Mysql optimering til REGEXP

  4. mangler nøgleordsfejl i oracle CASE WHEN sql-sætning