Foros del Web » Programando para Internet » PHP »

Tabla multidimensional: cómo afrontar el problema?

Estas en el tema de Tabla multidimensional: cómo afrontar el problema? en el foro de PHP en Foros del Web. Buenos días, tengo un problema que solucionar y la verdad que no sé ni como afrontarlo. A través de la siguiente consulta que me muestra ...
  #1 (permalink)  
Antiguo 18/09/2012, 04:56
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Tabla multidimensional: cómo afrontar el problema?

Buenos días,

tengo un problema que solucionar y la verdad que no sé ni como afrontarlo.

A través de la siguiente consulta que me muestra el número de actividades que ha realizado cada usuario, agrupadas por mes:

Código:
SELECT COUNT(trabajos.actividades) AS numero_actividades, consultores.consultor AS consultor, trabajos.mes AS mes FROM trabajos INNER JOIN consultores ON trabajos.consultores_Ident_consultor  = consultores.Ident_consultor WHERE ((consultores.esconsultor) = '1' AND ((consultores.f_fin IS NULL) OR (consultores.f_fin) = '0000-00-00')) GROUP BY consultor, mes ORDER BY consultor, ano, mes DESC
Quiero generara dinámicamente una tabla donde el nombre de las columnas sean los meses, la columna de la izquierda un listado de consultores y los datos. Sería algo así:

Código HTML:
<table border=1>
    <tr>
        <td>Usuario</td>
        <td>mes 1</td>
        <td>mes 2</td>
        <td>mes 3</td>
        <td>mes 4</td>
        etc etc 
    </tr>
    <tr>
        <td>usuario 1</td>
        <td>8;</td>
        <td>0</td>
        <td>25</td>
        <td>37</td>
    </tr>
    <tr>
        <td>usuario 2</td>
         <td>22;</td>
        <td>4</td>
        <td>22</td>
        <td>44</td>
    </tr>
    
</table> 
y así sucesivamente.

Había pensado en la posibilidad de extraer los datos por separado, es decir, por un lado los meses, por otro los usuarios y por el otro la cuenta de actividades.

No pido que me solucionéis el problema, pero a ver si me podéis ir orientando para lograrlo. Muchas gracias por anticipado y un saludo.
  #2 (permalink)  
Antiguo 18/09/2012, 07:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Tabla multidimensional: cómo afrontar el problema?

La cabecera con los nombres de los meses yo la generaria aparte, con los meses sin saltos....

Código HTML:
Ver original
  1. <table border=1>
  2.     <tr>
  3.         <td>Usuario</td>
  4.         <td>mes 1</td>
  5.         <td>mes 2</td>
  6.         <td>mes 3</td>
  7.         <td>mes 4</td>

Luego obtendria los datos asegurandome que me llegan ordenados por usuario y mes...

usuario;mes;dato
usuario1,1,dato
usuario1,3,dato
usuario2,1,dato
usuario2,2,dato
usuario3,2,dato

Necesitas variables para saber cual es el usuario anterior y cual es el mes anterior, y resetearlas convenientemente cada vez que haya un cambio...

$usuarioAnt="";
$mesAnt=0;

A partir de aqui un bucle que lea los datos y que para cada cambio en el usuario (comparando con $usuarioAnt recuerda resetearla con el nuevo valor) introduzca tantos

Código HTML:
Ver original
  1. <td>&nbsp;</td>

(esto en el primer usuario no toca)

como meses falten para llegar al ultimo y el salto de linea y el nombre

Código HTML:
Ver original
  1. </tr>
  2.     <tr>
  3.         <td>usuario 1</td>

y para cada mes introduzca el dato siempre que el mes sea el que toca, como vienen ordenados es fácil de ver...

Si mes es el siguiente introduzco

Código HTML:
Ver original
  1. <td>Dato</td>

si no es el siguiente introduzco tantos

Código HTML:
Ver original
  1. <td>&nbsp;</td>

como meses se hayan saltado....y

Código HTML:
Ver original
  1. <td>Dato</td>

para el mes en cuestion...


Al final recuerda cerrar la tabla con tantos

Código HTML:
Ver original
  1. <td>&nbsp;</td>

como meses falten para llegar al ultimo y

Código HTML:
Ver original
  1. </tr>
  2.    



Hasta aqui puedo leer sin solucionartelo....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 18/09/2012 a las 07:24
  #3 (permalink)  
Antiguo 18/09/2012, 08:41
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Respuesta: Tabla multidimensional: cómo afrontar el problema?

Gracias quimfv, te estás convirtiendo en mi guía en esto del php.

pues mañana me pongo con ello y ya iré poniendo mis avances por si alguien le pueden servir.

Un saludo!
  #4 (permalink)  
Antiguo 19/09/2012, 05:43
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Respuesta: Tabla multidimensional: cómo afrontar el problema?

Me está costando mucho más de lo que esperaba cuando vi ayer el mensaje...

Las cabeceras las muestro sin problemas a través de esta función
Código:
    public function ListadoMes(){
	
	$query="Select id_mes, mes from mes ORDER BY id_mes";
	$consulta = new Consulta($query);
	while($fila = $consulta->obtener_fila()) {
		$listado_mes[] = array(
				'id_mes'		=> 	$fila['id_mes'],               		 
				'mes' 			=>	$fila['mes']);
	}
	
	return $listado_mes;
    }
y también obtengo los datos que deseo mostrar ordenados

Código:
    public function EvolucionConsultores(){
    	
	$query= "SELECT consultores.consultor AS consultor, trabajos.mes AS mes, COUNT(trabajos.actividades) AS numero_actividades, FROM trabajos INNER JOIN consultores ON trabajos.consultores_Ident_consultor  = consultores.Ident_consultor 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";
	
	echo $query;
	
    $consulta = new Consulta($query);
	while($fila = $consulta->obtener_fila()) {
		$consultores_evol[] = array(
				'consultor'		=> 	$fila['consultor'],               		 
				'mes' 			=>	$fila['mes'],
				'preciototal' 			=>	$fila['preciototal']);
	}
	
	return $consultores_evol;
    }
desde archivo.php llamo a la función

Código:
	
$tpl->set_vars(array( 'listado_mes'	=> $usuario->ListadoMes()));

$tpl->set_vars(array( evolucion_consultores'=>$usuario->EvolucionConsultores()));
      
        $tpl_cuerpo= 'consultor_admin_evolucion_inicio.tpl.php';
y a partir de aquí me pierdo la verdad

Código:
<?php
$usuarioAnt="";
$mesAnt=0;

    foreach($evolucion_consultores AS $evolucion){
	


?>

<td><?=$evolucion['consultor'];?></td>
Puedo mostrar todos los datos si quiero, pero no tengo idea de cómo colocarlos como yo quiero y usar las variables $usuarioAnt=""; y $mesAnt=0;

Muchas gracias y un saludo!
  #5 (permalink)  
Antiguo 19/09/2012, 06:38
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 58
Respuesta: Tabla multidimensional: cómo afrontar el problema?

prueba si funciona así. yo he contado con que hay tres resultados principales en la consulta. Consultores, mes y precio
Código PHP:
Ver original
  1. <?php
  2. $tabla = mysql_query("SELECT consultores.consultor AS consultor, trabajos.mes AS mes, COUNT(trabajos.actividades) AS numero_actividades, FROM trabajos INNER JOIN consultores ON trabajos.consultores_Ident_consultor  = consultores.Ident_consultor 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");
  3. $array=array();
  4. while($row_tabla = mysql_fetch_array($tabla)){//montar un array con el consulto como key
  5.     if(!array_key_exists($row_tabla['consultor'], $array)){
  6.         $array[$row_tabla['consultor']]=array();
  7.     }
  8.     if(!array_key_exists($row_tabla['mes'], $array)){ //dentro de cada array otro array con la mes como key
  9.         $array[$row_tabla['consultor']][$row_tabla['mes']]=0;
  10.     }
  11.     $array[$row_tabla['consultor']][$row_tabla['mes']]+=$row_tabla['preciototal'];//suma tiempos si hay mas de preciototal por mes
  12. }
  13. ?>
  14. <table border="1">
  15. <tr><th>CONSULTORES</th>
  16. <?php
  17. $cuenta_tareas=array();//array para guardar meses
  18. $salida=''; //salida
  19. foreach($array as $k=>$v){//crear cabecera de meses
  20.     foreach($v as $clave=>$valor){
  21.         if(!in_array($clave,$cuenta_tareas)){//si no ha salido
  22.             $cuenta_tareas[]=$clave;//la guardamos en el array y la mostramos
  23.             $salida.="<th>".$clave."</th>";
  24.         }
  25.     }
  26. }
  27. $salida.='</tr><tr>';//cerrar cabecera
  28. $cuenta_filas=0;//contador de filas
  29. foreach($array as $k=>$v){
  30.     $salida.= "<td>".$k."</td>";//muestra el consultor
  31.         for($i=0;$i<count($cuenta_tareas);$i++){//recorre el array de cabeceras
  32.             if(array_key_exists($cuenta_tareas[$i],$v)){//si existe en la posicion actual mostramos el resultado
  33.                     $salida.="<td>".$v[$cuenta_tareas[$i]]."</td>";
  34.                 }else{//si no existe ponemos celda vacía
  35.                     $salida.="<td>-</td>";
  36.                 }
  37.         }
  38.     if(count($array)>($cuenta_filas+1)){//cerrar filas si no es la última
  39.         $salida.='</tr><tr>';
  40.     }
  41.     $cuenta_filas++;
  42. }
  43. echo $salida;
  44. ?>
  45. </tr></table>
  #6 (permalink)  
Antiguo 19/09/2012, 08:37
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Respuesta: Tabla multidimensional: cómo afrontar el problema?

muchas gracias jossss. efectivamente así funciona pero voy a tener que echarle un ojo detenidamente para comprender bien el código ya que no había trabajado nunca con arrays tan complejos.

gracias
  #7 (permalink)  
Antiguo 19/09/2012, 10:02
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 58
Respuesta: Tabla multidimensional: cómo afrontar el problema?

Puedes hacerle un var_dump($array) justo antes de <table border="1"> y verás la estructura del array. Realmente es un array que tiene por clave el consultor y por valor tiene otro array cuya clave es el mes y como valor el precio total.

Etiquetas: multidimensional, 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 21:43.