Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment fusionner une ligne de table avec un tableau PHP ?

J'utilise la technique de "lecture anticipée" pour traiter les boucles imbriquées. Cela signifie que les boucles 'foreach' ne peuvent pas être utilisées car l'enregistrement suivant doit être lu dès que l'enregistrement en cours a été traité. Fondamentalement, la dernière action que vous effectuez dans la boucle est de lire l'enregistrement suivant au fur et à mesure que vous le configurez pour la prochaine itération. Notez que vous ne testez jamais quand imprimer un enregistrement car cela est décidé par la structure des groupes. Les boucles de code sont les mêmes que la structure des groupes dans les données

Un 'groupe' est tout les enregistrements avec le même id .

Je suppose que le 'contenu' et 'l'acte' sont identiques pour chaque entrée du groupe.

Modifié pour ajouter des attributs 'rowspan' aux balises 'td' appropriées. Je soupçonne que css peut être plus facile à ce stade.

Le problème est que le groupe ne peut pas être affiché tant que le nombre d'entrées qu'il contient n'est pas connu.

Donc, je "tamponne" tous les enregistrements appartenant à un groupe dans un tableau. à la fin du groupe, il est affiché avec les attributs 'rowspan' appropriés dans le code html.

Il est testé sur PHP 5.3.18. Il comprend des données de test.

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