Ayuda con diseño php

Cordial Saludo.
Debo mostrar el numero de pacientes que atiende un medico de acuerdo a la fecha que esta en la base de datos Ej:
Medico total 05/01/2005 05/03/2005 ...
XXXXX 9 4 5
YYYYY 1
ZZZZZ 8 6 2
Los datos los traigo de la bd de acuerdo a la fecha el problema es como ordeno los datos. Este es el resultado que me arroja la consulta y no lo necesito así
XXXXX 05/01/2005 4
XXXXX 05/03/2005 5
YYYYY 05/03/2005 1
ZZZZZ 05/01/2005 6
ZZZZZ 05/03/2005 2
¿Se puede organizar la estructura de acuerdo al formato mencionado?
Medico total fecha1 fecha2 fecha...
Agradezco la ayuda que me puedas brindar.
Respuesta
1
Ya he podido ponerme con ello, no es algo sencillo de resolver ya que no he encontrado la forma de mostrar los datos usando una consulta sql. Es necesario implementar un código como el siguiente:
<?php
// Conexión con la base de datos y selección de la tabla
$id = mysql_connect('localhost', 'root', '');
mysql_select_db('Medicos', $id);
// Obtener un array con todas las fechas posibles ordenadas
$consulta = "select DISTINCT Fecha from Medico order by Fecha";
$datos = mysql_query($consulta, $id);
$fechas = array();
$fechas[0][0] = "Médico";
$numFechas = 1;
while( $unaFecha = mysql_fetch_array( $datos )) {
$fechas[0][ $numFechas++ ] = $unaFecha['Fecha'];
}
// Obtener los datos de médicos y pacientes atendidos
$consulta = "select * from Medico order by Medico, Fecha";
$datos = mysql_query($consulta, $id);
$numMed = 0;
$medicoActual = '';
while( $unMedico = mysql_fetch_array( $datos )) {
if ($unMedico['Medico'] != $medicoActual) {
$numMed++;
$medicoActual = $unMedico['Medico'];
}
$fechas[ $numMed ][0] = $unMedico['Medico'];
$num = 1;
while( $num < $numFechas ) {
if ( $unMedico['Fecha'] == $fechas[0][ $num ] ) {
$fechas[ $numMed ][ $num ] = $unMedico['Pacientes'];
} else {
if ( !isset($fechas[ $numMed ][ $num ]) ) {
$fechas[ $numMed ][ $num ] = '-';
}
}
$num++;
}
}
// Mostrar una tabla con los datos
$tablaDatos = "<table border=1>";
for ($med = 0; $med <= $numMed; $med++) {
$tablaDatos .= " <tr> ";
for ($num = 0; $num < $numFechas; $num++) {
$tablaDatos .= " <td> " . $fechas[ $med ][ $num ] . " </td>";
}
$tablaDatos .= " </tr>";
}
$tablaDatos .= " </table>";
echo $tablaDatos;
?>
Adapta ese código a tu base de datos, cambiando los nombres que necesites. Yo les he llamado Medico, Fecha, Pacientes, etc.
Saludos.
Me sale de maravillas, debo hacerles unas cosas como exportar a excel esa información tal como se muestra, otra columna para el total por medico; ¿Supongo qué debo crear otra matriz para agregar el total verdad?
Agradezco la ayuda prestada.
Saludos.
He intentado comprender tu código; sale muy bien, pero no entiendo ese cuento de los arreglos; intente poner el total después de Medico pero me salían unas locuras; por lo que no entiendo eso de los array, he consultado pero sigo igual de confundido.
Si no puedes aclararme un poco acerca de esto para poner el valor después de medico escríbelo para cerrar la pregunta.
Solo hay que hacer una pequeña modificación insertando la variable $totalMedico que realiza la suma de los pacientes atendidos por cada médico.
El código completo modificado es el siguiente:
<?php
// Conexión con la base de datos y selección de la tabla
$id = mysql_connect('localhost', 'root', '');
mysql_select_db('Medicos', $id);
// Obtener un array con todas las fechas posibles ordenadas
$consulta = "select DISTINCT Fecha from Medico order by Fecha";
$datos = mysql_query($consulta, $id);
$fechas = array();
$fechas[0][0] = "Médico";
$numFechas = 1;
while( $unaFecha = mysql_fetch_array( $datos )) {
$fechas[0][ $numFechas++ ] = $unaFecha['Fecha'];
}
$fechas[0][ $numFechas++ ] = "Total";
// Obtener los datos de médicos y pacientes atendidos
$consulta = "select * from Medico order by Medico, Fecha";
$datos = mysql_query($consulta, $id);
$numMed = 0;
$medicoActual = '';
$totalMedico = 0;
while( $unMedico = mysql_fetch_array( $datos )) {
if ($unMedico['Medico'] != $medicoActual) {
$numMed++;
$medicoActual = $unMedico['Medico'];
$totalMedico = 0;
}
$fechas[ $numMed ][0] = $unMedico['Medico'];
$num = 1;
while( $num < ($numFechas-1) ) {
if ( $unMedico['Fecha'] == $fechas[0][ $num ] ) {
$fechas[ $numMed ][ $num ] = ($unMedico['Pacientes'])*1;
$totalMedico += $fechas[ $numMed ][ $num ];
} else {
if ( !isset($fechas[ $numMed ][ $num ]) ) {
$fechas[ $numMed ][ $num ] = '-';
}
}
$num++;
}
$fechas[ $numMed ][ $numFechas-1 ] = $totalMedico;
}
// Mostrar una tabla con los datos
$tablaDatos = "<table border=1>";
for ($med = 0; $med <= $numMed; $med++) {
$tablaDatos .= " <tr> ";
for ($num = 0; $num < $numFechas; $num++) {
$tablaDatos .= " <td> " . $fechas[ $med ][ $num ] . " </td>";
}
$tablaDatos .= " </tr>";
}
$tablaDatos .= " </table>";
echo $tablaDatos;
?>
Últimamente suelo estar bastante ocupado y no tengo mucho tiempo para responder las preguntas de todoexpertos, por eso quizá he sido un poco breve.
Lo que hago en el código es crear un array bidimensional que tendrá el contenido de la tabla en la memoria. Así es más fácil de trabajar con los datos y mostrarlos en pantalla. Un array bidimensional tiene dos indices, uno de la fila y otro de la columna. La representación sería la siguiente:
----------------------------
? ¿[0][0]? ¿[0][1]? ¿[0][2]?
----------------------------
? ¿[1][0]? ¿[1][1]? ¿[1][2]?
----------------------------
? ¿[2][0]? ¿[2][1]? ¿[2][2]?
----------------------------
? ¿[3][0]? ¿[3][1]? ¿[3][2]?
----------------------------
Los números del interior de cada celda es la forma de acceder al dato que se almacena ahí. Para intercambiar las columnas 1 y 2, por ejemplo, hay que intercambiar esos dos indices a la hora de ir rellenando el array.
En el código, tienes el array $fecha, cuya representación sería:
------------------------ ··· ----------------------
? ¿Médico? ¿<Fecha 1>? ¿<Fecha n>? ¿Total?
------------------------ ··· ----------------------
? ¿<Medico>? ¿<num>? ¿<num>? ¿<suma>?
------------------------ ··· ----------------------
··· ···
------------------------ ··· ----------------------
? ¿<Medico>? ¿<num>? ¿<num>? ¿<suma>?
------------------------ ··· ----------------------
Si lo que quieres es mover la columna del total justo detrás del medico, tienes que poner a la columna total un 1 como segundo índice, y desplazar el resto de columnas. Como el numero de columna se almacena en $numFechas, tienes que aumentarlo.
Tendrías que sustituir el siguiente código:
$fechas = array();
$fechas[0][0] = "Médico";
$numFechas = 1;
while( $unaFecha = mysql_fetch_array( $datos )) {
$fechas[0][ $numFechas++ ] = $unaFecha['Fecha'];
}
$fechas[0][ $numFechas++ ] = "Total";
por:
$fechas = array();
$fechas[0][0] = "Médico";
$fechas[0][1] = "Total";
$numFechas = 2;
while( $unaFecha = mysql_fetch_array( $datos )) {
$fechas[0][ $numFechas++ ] = $unaFecha['Fecha'];
}
La siguiente modificación es en las líneas:
$num = 1;
while($num < ($numFechas-1)){
que las tienes que cambiar por:
$num = 2;
while( $num < ($numFechas) ){
Y la siguiente línea:
$fechas[ $numMed ][ $numFechas-1 ] = $totalMedico;
por
$fechas[ $numMed ][ 1 ] = $totalMedico;
Como ves, lo que hago es cambiar el índice de la última columna que antes era el total, por el índice 1 para que pase a ocupar la segunda columna (los índices de los arrays empiezan desde el cero). Y adapto el resto del código para que las fechas empiecen a partir del índice 2.
Intentalo tu mismo con esas aclaraciones, seguro que no tienes ningún problema. De todas formas te pongo el código completo:
<?php
// Conexión con la base de datos y selección de la tabla
$id = mysql_connect('localhost', 'root', '');
mysql_select_db('Medicos', $id);
// Obtener un array con todas las fechas posibles ordenadas
$consulta = "select DISTINCT Fecha from Medico order by Fecha";
$datos = mysql_query($consulta, $id);
$fechas = array();
$fechas[0][0] = "Médico";
$fechas[0][1] = "Total";
$numFechas = 2;
while( $unaFecha = mysql_fetch_array( $datos )) {
$fechas[0][ $numFechas++ ] = $unaFecha['Fecha'];
}
// Obtener los datos de médicos y pacientes atendidos
$consulta = "select * from Medico order by Medico, Fecha";
$datos = mysql_query($consulta, $id);
$numMed = 0;
$medicoActual = '';
$totalMedico = 0;
while( $unMedico = mysql_fetch_array( $datos )) {
if ($unMedico['Medico'] != $medicoActual) {
$numMed++;
$medicoActual = $unMedico['Medico'];
$totalMedico = 0;
}
$fechas[ $numMed ][0] = $unMedico['Medico'];
$num = 2;
while( $num < ($numFechas) ) {
if ( $unMedico['Fecha'] == $fechas[0][ $num ] ) {
$fechas[ $numMed ][ $num ] = ($unMedico['Pacientes'])*1;
$totalMedico += $fechas[ $numMed ][ $num ];
} else {
if ( !isset($fechas[ $numMed ][ $num ]) ) {
$fechas[ $numMed ][ $num ] = '-';
}
}
$num++;
}
$fechas[ $numMed ][ 1 ] = $totalMedico;
}
// Mostrar una tabla con los datos
$tablaDatos = "<table border=1>";
for ($med = 0; $med <= $numMed; $med++) {
$tablaDatos .= " <tr> ";
for ($num = 0; $num < $numFechas; $num++) {
$tablaDatos .= " <td> " . $fechas[ $med ][ $num ] . " </td>";
}
$tablaDatos .= " </tr>";
}
$tablaDatos .= " </table>";
echo $tablaDatos;
?>

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas