sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo fusionar la fila de la tabla con la matriz de PHP?

Utilizo la técnica de 'lectura anticipada' para procesar bucles anidados. Significa que los bucles 'foreach' no se pueden usar ya que el siguiente registro debe leerse tan pronto como se haya procesado el actual. Básicamente, la última acción que realiza en el ciclo es leer el siguiente registro mientras lo configura para la próxima iteración. Tenga en cuenta que nunca prueba cuándo imprimir un registro, ya que eso lo decide la estructura de los grupos. Los bucles de código son los mismos que la estructura de los grupos en los datos

Un 'grupo' es todo los registros con el mismo id .

Supongo que el 'contenido' y el 'acto' son idénticos para cada entrada en el grupo.

Editado para agregar atributos 'rowspan' a las etiquetas 'td' apropiadas. Sospecho que css puede ser más fácil en este punto.

El problema es que el grupo no se puede mostrar hasta que se sepa cuántas entradas hay en él.

Por lo tanto, 'buffer' todos los registros que pertenecen a un grupo en una matriz. al final del grupo, se muestra con los atributos 'rowspan' apropiados en el html.

Está probado en PHP 5.3.18. Incluye datos de prueba.

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