Foros del Web » Programando para Internet » PHP »

Generar tabla compleja

Estas en el tema de Generar tabla compleja en el foro de PHP en Foros del Web. Buenos días/tardes, estoy intentando construir una tabla donde tanto el nombre de las columnas, de las filas, y los datos de las celdas, se extraen ...
  #1 (permalink)  
Antiguo 24/10/2012, 04:12
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años, 7 meses
Puntos: 3
Generar tabla compleja

Buenos días/tardes,

estoy intentando construir una tabla donde tanto el nombre de las columnas, de las filas, y los datos de las celdas, se extraen desde una base de datos. Tenía hecho algo parecido, con la ayuda de uno de vosotros, pero no consigo adaptarlo a mi propósito. Quiero una tabla que me quede aproximadamente así:

Código HTML:
<table>
<tr>
<td>CONSULTOR</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
<td>10</td>
<td>11</td>
<td>12</td>
<td>13</td>

</tr>
<tr>
<td>Juan Fernandez</td>
<td>no</td>
<td>si</td>
<td>si</td>
<td>si</td>
<td>si</td>
<td>si</td>
<td>si</td>
<td>no</td>
<td>no</td>
<td>si</td>
<td>si</td>
<td>si</td>
<td>si</td>
</tr>

<tr>
<td>Pepito Corneta </td>
<td>si</td>
<td>no</td>
<td>no</td>
<td>si</td>
<td>si</td>
<td>si</td>
<td>si</td>
<td>no</td>
<td>no</td>
<td>si</td>
<td>si</td>
<td>si</td>
<td>si</td>
</tr>
</table> 
y este es el código para que se genere la tabla

Código PHP:
    <?php
    
$usuario 
= new usuario();
$cons $usuario->ObtenerConsultores();
        
    foreach(
$cons as $consultores) {
$consultor_no_report $consultores['Ident_consultor'];

$query2="Select calendario_dias.dia AS dia, consultores.consultor AS consultor from calendario_dias, consultores WHERE calendario_dias.mes = '$mes' AND dia NOT IN (SELECT DISTINCT trabajos.dia FROM trabajos INNER JOIN consultores ON trabajos.consultores_Ident_consultor = consultores.Ident_consultor WHERE mes = '$mes' AND ano = '$anos' AND (consultores.Ident_consultor) = '$consultor_no_report')AND (consultores.Ident_consultor) = '$consultor_no_report' AND (consultores.esconsultor) = '1' AND (consultores.reporte_habitual) = '1' AND ((consultores.f_fin)='' OR (consultores.f_fin) = '0000-00-00');";

/*    $query="SELECT consultores.consultor AS consultor, mes.mes AS mes, round(SUM(trabajos.preciototalK25),2) AS preciototal FROM trabajos INNER JOIN consultores ON trabajos.consultores_Ident_consultor  = consultores.Ident_consultor INNER JOIN mes ON trabajos.mes = mes.id_mes WHERE ((consultores.esconsultor) = '1' AND ((consultores.f_fin IS NULL) OR (consultores.f_fin) = '0000-00-00')) GROUP BY consultor, mes ORDER BY consultores.consultor, trabajos.ano, trabajos.mes ASC;";
*/    
    
$consulta = new Consulta($query2);
   
    
$array=array();
    while(
$row_tabla $consulta->obtener_fila()) {//montar un array con el consultor como key
        
if(!array_key_exists($row_tabla['consultor'], $array)){
            
$array[$row_tabla['consultor']]=array();
        }
        if(!
array_key_exists($row_tabla['dia'], $array)){ //dentro de cada array otro array con la mes como key
            
$array[$row_tabla['consultor']][$row_tabla['dia']]=0;
        }
        
$array[$row_tabla['consultor']][$row_tabla['dia']]+=$row_tabla['preciototal'];//suma tiempos si hay mas de preciototal por mes
    
}
    
var_dump($array);
    
?>
    
    <table border="1">
    <tr><th>CONSULTORES</th>
    <?php
    $cuenta_tareas
=array();//array para guardar meses
    
$salida=''//salida
    
foreach($array as $k=>$v){//crear cabecera de meses
        
foreach($v as $clave=>$valor){
            if(!
in_array($clave,$cuenta_tareas)){//si no ha salido
                
$cuenta_tareas[]=$clave;//la guardamos en el array y la mostramos
                
$salida.="<th>".$clave."</th>";
            }
        }
    }
    
$salida.='</tr><tr>';//cerrar cabecera
    
$cuenta_filas=0;//contador de filas
    
foreach($array as $k=>$v){
        
$salida.= "<td>".$k."</td>";//muestra el consultor
            
for($i=0;$i<count($cuenta_tareas);$i++){//recorre el array de cabeceras
                
if(array_key_exists($cuenta_tareas[$i],$v)){//si existe en la posicion actual mostramos el resultado
                        
$salida.="<td>".$v[$cuenta_tareas[$i]]."</td>";
                    }else{
//si no existe ponemos celda vacía
                        
$salida.="<td>-</td>";
                    }
            }
        if(
count($array)>($cuenta_filas+1)){//cerrar filas si no es la última
            
$salida.='</tr><tr>';
        }
        
$cuenta_filas++;
    }
}
    echo 
$salida;
    
?>
En estos momentos lo único que me saca es el nombre de la cabecera <th>CONSULTOR</th> tantas veces como se ejecuta la consulta

Muchas gracias y un saludo
  #2 (permalink)  
Antiguo 24/10/2012, 04:17
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años, 7 meses
Puntos: 3
Respuesta: Generar tabla compleja

Disculpar que no he dicho mi propósito. Lo que intento es que me muestre una tabla donde las columnas sean los días del mes, la primera celda de cada fila sea el nombre del usuario y me vaya recorriendo los días, marcando aquellos en los que no ha accedido al sistema.
Gracias de nuevo
  #3 (permalink)  
Antiguo 24/10/2012, 09:55
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años, 7 meses
Puntos: 3
Respuesta: Generar tabla compleja

Voy avanzando a duras penas... He conseguido colocar los días en las cabeceras y el nombre los consultores. Me falta recorrer los días por cada usuario y que me marque aquellos días en los que no haya accedido al sistema... alguien ve el error o se le ocurre cómo?

Código PHP:
<table border="1">
    <tr><th>CONSULTOR    </th>    <?php
    
$usuario 
= new usuario();
$cons $usuario->ObtenerConsultores();
        
    foreach(
$cons as $consultores) {
$consultor_no_report $consultores['Ident_consultor'];

$query2="Select calendario_dias.dia AS dia, consultores.consultor AS consultor from calendario_dias, consultores WHERE calendario_dias.mes = '$mes' AND dia NOT IN (SELECT DISTINCT trabajos.dia FROM trabajos INNER JOIN consultores ON trabajos.consultores_Ident_consultor = consultores.Ident_consultor WHERE mes = '$mes' AND ano = '$anos' AND (consultores.Ident_consultor) = '$consultor_no_report')AND (consultores.Ident_consultor) = '$consultor_no_report' AND (consultores.esconsultor) = '1' AND (consultores.reporte_habitual) = '1' AND ((consultores.f_fin)='' OR (consultores.f_fin) = '0000-00-00');";

/*    $query="SELECT consultores.consultor AS consultor, mes.mes AS mes, round(SUM(trabajos.preciototalK25),2) AS preciototal FROM trabajos INNER JOIN consultores ON trabajos.consultores_Ident_consultor  = consultores.Ident_consultor INNER JOIN mes ON trabajos.mes = mes.id_mes WHERE ((consultores.esconsultor) = '1' AND ((consultores.f_fin IS NULL) OR (consultores.f_fin) = '0000-00-00')) GROUP BY consultor, mes ORDER BY consultores.consultor, trabajos.ano, trabajos.mes ASC;";
*/    
    
$consulta = new Consulta($query2);
   
    
$array=array();
    while(
$row_tabla $consulta->obtener_fila()) {//montar un array con el consultor como key
        
if(!array_key_exists($row_tabla['consultor'], $array)){
            
$array3[$row_tabla['consultor']]=array();
        }
        if(!
array_key_exists($row_tabla['dia'], $array)){ //dentro de cada array otro array con la mes como key
            
$array2[$row_tabla['consultor']][$row_tabla['dia']]=0;
        }
      
/*  $array[$row_tabla['consultor']][$row_tabla['dia']]+=$row_tabla['preciototal'];//suma tiempos si hay mas de preciototal por mes */
    
}

    
?>

    <?php
    $cuenta_tareas
=array();//array para guardar dias
    
$salida=''//salida
    
foreach($array2 as $k=>$v){//crear cabecera de dias
        
foreach($v as $clave=>$valor){
            if(!
in_array($clave,$cuenta_tareas)){//si no ha salido
                
$cuenta_tareas[]=$clave;//la guardamos en el array y la mostramos
                
$salida.="<th>".$clave."</th>";
            }
        }
    }
    
$salida.='</tr><tr>';//cerrar cabecera

    
$cuenta_filas=0;//contador de filas
    
foreach($array3 as $k=>$v){
$salida.="<tr>";
        
$salida.= "<td>"$k."</td>";//muestra el consultor
    
            
for($i=0;$i<count($cuenta_tareas);$i++){//recorre el array de cabeceras

                
if(array_key_exists($cuenta_tareas[$i],$v)){//si existe en la posicion actual mostramos el resultado
            
                        
$salida.="<td>".$v[$cuenta_tareas[$i]]."</td>";
                    }else{
//si no existe ponemos celda vacía
                        
$salida.="<td>-</td>";
        }
            }
$salida.="</tr>";
        if(
count($array)>($cuenta_filas+1)){//cerrar filas si no es la última
            
$salida.='</tr><tr>';
        }
        
$cuenta_filas++;
    }
}
    echo 
$salida;
    
?>
    </tr>
    <tr>
    <td></td>
</form>
</table>
</div>
Gracias y un saludo
  #4 (permalink)  
Antiguo 25/10/2012, 06:20
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años, 7 meses
Puntos: 3
Respuesta: Generar tabla compleja

voy avanzando aunque todavía me queda un pelín... a ver si alguien me puede ayudar. Mi problema es al generar los arrays y compararlos. Por un lado tengo $cuenta_tareas que lo voy llenando al crear las cabeceras de la tabla
Código PHP:
    $cuenta_tareas=array();//array para guardar dias
    
$salida=''//salida
    
foreach($array2 as $k=>$v){//crear cabecera de dias
        
foreach($v as $clave=>$valor){
            if(!
in_array($clave,$cuenta_tareas)){//si no ha salido
                
$cuenta_tareas[]=$clave;//la guardamos en el array y la mostramos
                
$salida.="<th>".$clave."</th>";
            }
        }
    } 
si hago un var_dump el resultado es array(31) {
[0]=> int(2) [1]=> int(3) [2]=>int(4) [3]=> int(5) [4]=> int(6) [5]=> int(7) [6]=> int(8) [7]=> int(9) [8]=>int(10) [9]=> int(11) [10]=> int(12) [11]=> int(13) [12]=> int(14) [13]=> int(20) [14]=> int(21) [15]=> int(27) [16]=> int(28) [17]=>
int(19) [18]=> int(22) [19]=> int(23) [20]=> int(24) [21]=> int(25) [22]=> int(26) [23]=> int(29) [24]=> int(30) [25]=> int(31) [26]=> int(1) [27]=> int(15) [28]=> int(16) [29]=> int(17) [30]=> int(18)
}
el otro array me sacaría los días en los que los usuarios han accedido al sistema:
Código PHP:
$query3="SELECT DISTINCT trabajos.dia AS dia FROM trabajos INNER JOIN consultores ON trabajos.consultores_Ident_consultor = consultores.Ident_consultor WHERE mes = '$mes' AND ano = '$anos' AND (consultores.Ident_consultor) = '$consultor_no_report';";
    
$consulta = new Consulta($query3);
    
$array4=array();
    while(
$row_tabla $consulta->obtener_fila()) {//montar un array con el consultor como key
            
$array4[]=($row_tabla['dia']+0);
    } 
y con var_dump($array4) obtenemos
array(13) {
[0]=> int(5) [1]=> int(3) [2]=> int(2) [3]=> int(4) [4]=> int(1) [5]=> int(19) [6]=> int(12) [7]=> int(9) [8]=> int(11) [9]=> int(8) [10]=> int(10) [11]=> int(0)
[12]=>int(23) }

y después, usando in_array, quiero que me muestre un SI o un NO dependiendo de si $cuenta_tareas se encuentra en $array o no.
Código PHP:
            for($i=0;$i<count($cuenta_tareas);$i++){//recorre el array de cabeceras
        
                
if(in_array($cuenta_tareas[$i],$array4)){//si existe en la posicion actual mostramos el resultado
            
                        
$salida.="<td>SI</td>";
                    }else{
//si no existe ponemos celda vacía
                        
$salida.="<td>NO</td>";
        }
        
            } 
El resultado es siempre NO...Creo que el problema está al generar el array... ¿alguna otra idea?
Gracias

Etiquetas: compleja, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:22.