Cómo combinar la fila de la tabla con la matriz de PHP?

Quiero fusionar la fila de la tabla si la fecha tiene una misma identificación. Tengo algunos datos de matriz como esta:

Array ( [0] => Array ( [id] => 2 [date] => 05/13/2014 [content] => some contents 1 [act] => act1 act2 act3 ) [1] => Array ( [id] => 2 [date] => 05/28/2014 [content] => some contents 1 [act] => act1 act2 act3 ) [2] => Array ( [id] => 7 [date] => 06/04/2014 [content] => some contents 2 [act] => act1 act2 act3 ) ) 

Luego traté de agrupar sus datos en la misma ID por:

  if($queryx = $this->mymodel->myfunction($par)){ $datax = $queryx; } $i = 0; foreach ($datax as $idx => $val) { $dates[$val['id']][$i] = $val['date'].",".$val['id']; $contn[$val['id']][$i] = $val['content']; $i++; } 

entonces :

  $j = 0; $y = 0; echo "\r\n"; foreach ($dates as $idx => $val) { $tmpexp = explode(',', $val[$j]); echo "\r\n"; echo "\r\n"; foreach ($val as $idx1 => $val1) { if($idx1 > 0) { echo "\r\n"; } echo "\r\n"; if($idx1 < 1) { echo "\r\n"; echo ""; echo "\r\n"; } $y++; } $j++; } echo "
".$tmpexp[0]."
".$dates[$tmpexp[1]][$y]."".$contn[$tmpexp[1]][$y]."act1 act2 act3
";

No hay problema si los datos tienen al menos dos hijos, pero si la fecha solo tiene un hijo (ver datos con id’s 7), se muestra un error porque la compensación no está definida. Entonces, ¿cómo agrego algún controlador si solo hay un niño en los datos? Hay mi resultado deseado:

Por favor mira esta imagen:

Uso la técnica de “lectura anticipada” para procesar bucles nesteds. 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 haces en el ciclo es leer el próximo registro mientras lo estás configurando para la próxima iteración. Tenga en cuenta que nunca prueba cuándo imprimir un registro como 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’ son todos los registros con el mismo ID .

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

Editado para agregar atributos ‘rowspan’ a las tags ‘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 contiene.

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.

Se prueba 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>      < ?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 ''; echo ''; $rowspan = count($buffer) > 1 ? ' rowspan="'. count($buffer) .'"' : ''; echo '', ''; echo ''; for($i = 1; $i < count($buffer); $i++) { echo ''; echo ''; } } ?> 
DateContentAct
', $buffer[0]['date'], '', $buffer[0]['content'], '', $buffer[0]['act'], '
', $buffer[$i]['date'], '

El siguiente código le dará una pista de lo que debe hacer,

 $newArray = array(); $counter=0; foreach($datax as $key=>$val){ $newArray[$val['id']][$counter]['date'] = $val['date']; $newArray[$val['id']][$counter]['content'] = $val['content']; $newArray[$val['id']][$counter]['act'] = $val['act']; $counter++; } $newArray = array_map('array_values', $newArray);