Foros del Web » Programando para Internet » PHP »

Ayuda con aplicación, problemas en array

Estas en el tema de Ayuda con aplicación, problemas en array en el foro de PHP en Foros del Web. Hola a tod@s, estoy haciendo una funcionalidad a mi aplicación que me calcule las horas trabajadas de cada dia. Cuando el usuario ficha, se guarda ...
  #1 (permalink)  
Antiguo 14/10/2008, 08:26
 
Fecha de Ingreso: junio-2008
Mensajes: 56
Antigüedad: 15 años, 10 meses
Puntos: 1
Ayuda con aplicación, problemas en array

Hola a tod@s, estoy haciendo una funcionalidad a mi aplicación que me calcule las horas trabajadas de cada dia.

Cuando el usuario ficha, se guarda en una base de datos el usuario, la ip, la fecha, la hora y otra columna que guarda si es entrada o salida. Es decir, la base de datos queda asi: Fichaje( usuario, ip, fecha, hora, entrada_salida).

He echo una función que me calcula el primer dia de la semana. A partir de hago una consulta que me devuelve la fecha, la hora, si entrada o salida, hasta el dia de hoy. Lo guardo en un array y lo muestro en una tabla.

LO QUE QUISIERA HACER es coger de ese array las filas (2 filas como mucho, ya que del mismo dia solo puede fichar entrada y salida) con la misma fecha, y me reste a la hora de salida la de entrada.

Tengo creada una función para restar dos horas.

Recorro con un FOR el array entero para ir leyendo los datos y mostrarselos en una tabla. Y a partir de aqui me he quedado pillado para coger las dos horas.

Os muestro el código que lo veréis mejor:

Cita:
<?php
session_start();
include("configuracion.php");
if ($_SESSION['login'] == "" ) {

header("Location: index.php");
die(); // no sigo ejecutando la restante parte del script
}

include("primerdia.php");
include("restahoras.php");
$bbdd = mysql_connect($host, $usuario, $password) or die ("Could not connect: " . mysql_error()); //conectamos con base de datos.
$tablausuario = mysql_select_db($bd, $bbdd) or die(mysql_error());//seleccionamos base de datos fichaje de nuestra base de datos.
if (bbdd){
$cons_dias = 'select fecha,hora,entrada_salida from fichaje where user="'.$_SESSION[login].'" AND fecha >= "'.$primer_dia.'" ';
/* seleccionamos de la base de datos los datos que necesitaremos que serán la fecha, hora y la entrada o salida del usuario
registrado donde los registros que cogeremos sera el primer dia de la semana y los posteriores*/
//echo $cons_dias;
$respuesta = mysql_query($cons_dias, $bbdd) or die(mysql_error());; //ejecutamos la consulta.
$filas = mysql_num_rows($respuesta); //número de filas guardadas
echo '<br>';
/*echo 'Filas encontradas: ';
echo $filas;
echo '<br>';
*/
// Guardamos resultado en un array
$c=0;
while($fila[$c] = mysql_fetch_array($respuesta))
{
$c+=1;
$fecha = $fila[$c]["fecha"];
$hora = $fila[$c]["hora"];
$in_out = $fila[$c]["entrada_salida"];

}
/*echo "Arry respuesta:<br>";
print_r($fila); // muestro lo que tengo almacenado en el array.
*/

// Trabajamos con el Array
echo '<center>';
echo '<table width="50%" border="1" >';
echo '<tr>'; //fila
echo '<td width="40%" align="center"><p><b><font color="#000000">Fecha</font></b></p></td>';
echo '<td width="30%"align="center"><p><b><font color="#000000">Ficha</font></b></p></td>';
echo '<td width="30%"align="center"><p><b><font color="#000000">Hora</font></b></p></td></tr>';
for($d=0; $d<$c; $d++){
$fecha = $fila[$d]["fecha"];
$entr_sal = $fila[$d]["entrada_salida"];
$hora = $fila[$d]["hora"];
echo '<tr>';
echo '<td width="40%" valign="top" align="center" >';
echo $fecha;
echo '</td>';
echo '<td width="30%" valign="top" align="center" >';
echo $entr_sal;
echo '</td>';
echo '<td width="30%" valign="top" align="center" >';
echo $hora;
echo '</td></tr>';
} /* En este bucle es donde no se qué tengo
que hacer para coger las dos variables, o si tengo que hacer otro tipo
de bucle dentro de él mismo, o hacerlo fuera de él
*/
echo '</table>';
echo '</center>';
mysql_close();
}
?>
Me encantaría que me ayudárais ya que seguro que vosotros habréis conseguido hacer cosas del estilo y mucho más.

Un saludo y gracias.
  #2 (permalink)  
Antiguo 14/10/2008, 10:15
Avatar de Carlojas  
Fecha de Ingreso: junio-2007
Ubicación: Shikasta
Mensajes: 1.272
Antigüedad: 16 años, 10 meses
Puntos: 49
Respuesta: Ayuda con aplicación, problemas en array

Que tal alfredorz, si puedes ser un poco mas claro sería mucho mejor.



Saludos.
__________________
"SELECT * FROM Mujeres WHERE situacion NOT IN ('CASADAS','CON HIJOS','ATORMENTADAS','CUASI-ENNOVIADAS') AND personalidad <> 'INTENSA'"
  #3 (permalink)  
Antiguo 14/10/2008, 10:33
 
Fecha de Ingreso: junio-2008
Mensajes: 56
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Ayuda con aplicación, problemas en array

Hola carlojas, gracias por tu interés.

Con este código:
Cita:
for($d=0; $d<$c; $d++){
$fecha = $fila[$d]["fecha"];
$entr_sal = $fila[$d]["entrada_salida"];
$hora = $fila[$d]["hora"];

echo $fecha;

echo $entr_sal;

echo $hora;

}
Recorro todo el array y lo muestro por pantalla. La información que tiene el array son los dias que ha fichado a partir del primer lunes de esta semana.

Podría quedar algo asi (implementado con tablas, por ejemplo):

FECHA FICHA HORA
2008-10-13 entrada 13:00:00
2008-10-13 salida 16:00:00
2008-10-14 entrada 13:00:00
2008-10-14 salida 18:00:00

Lo que quiero hacer es que para cada fecha me reste la hora de salida menos la hora de entrada. (La función restar horas ya la tengo)

Es decir, por ejemplo, para el dia 2008-10-13 me coja una variable para la hora de salida ($hora2 = 16:00:00), y otra variable para la hora de entrada ($hora1 = 13:00:00) esto ya se lo paso a mi función que reste las horas. Y así sucesivamente para el dia 2008-10-14, 2008-10-15...

Lo que no sé cómo hacerlo, me he quedado en blanco en esta parte.

Espero haberme explicado bien.

Muchas gracias.

Lo que no sé es cómo hacer ese bucle o cómo implementarlo con funciones, aquí me he quedado un poco pillado.
  #4 (permalink)  
Antiguo 14/10/2008, 11:10
Avatar de Carlojas  
Fecha de Ingreso: junio-2007
Ubicación: Shikasta
Mensajes: 1.272
Antigüedad: 16 años, 10 meses
Puntos: 49
Respuesta: Ayuda con aplicación, problemas en array

Si ya tienes la función para restar las horas solo es questión que por cada iteracción del ciclo le pases las variables que contienes las horas, digo dentro de tu ciclo while
Código PHP:
while($fila mysql_fetch_array($respuesta)){
funcion_restar($horaini$horafin);} 


Saludos.
__________________
"SELECT * FROM Mujeres WHERE situacion NOT IN ('CASADAS','CON HIJOS','ATORMENTADAS','CUASI-ENNOVIADAS') AND personalidad <> 'INTENSA'"
  #5 (permalink)  
Antiguo 15/10/2008, 07:38
 
Fecha de Ingreso: junio-2008
Mensajes: 56
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Ayuda con aplicación, problemas en array

De esa manera no me vale ya que si estoy en la primera fila, por ejemplo, dia 2008-10-13 cuya columna de "entrada_salida" tiene Entrada y la columna hora tiene 13:00:00 entonces este valor se debe asignar a la segunda variable de entrada de mi funcion restahoras($hora1,$hora2), por lo que $hora2="13:0:00".

Una vez tenga esto debe pasar a la siguiente fila del array, mirar que a fecha anterior es igual que la fecha de esta fila y que la columna "entrada_salida" tiene como valor Salida, si es asi hay que coger la hora y asignarsela a la variable $hora1, que ahora tendrá por ejemplo el valor $hora1="16:00:00".

Y una vez que tenga estas 2 variables asignadas sólo pasarselas a la función restahoras ($hora1,hora2) que ya me devuelve la resta.

Una vez que tenga esto debería pasar a la siguiente fila, y asi sucesivamente.

No sé si con este ejemplo me habré explicado, la verdad es que tiene su complicación...
  #6 (permalink)  
Antiguo 15/10/2008, 07:57
 
Fecha de Ingreso: junio-2008
Mensajes: 56
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Ayuda con aplicación, problemas en array

Por ejemplo ahoramismo tengo creado el siguiente código:

Cita:
echo '<center>';
echo '<table width="50%" border="1" >';
echo '<tr>'; //fila
echo '<td width="25%" align="center"><p><b><font color="#000000">Fecha</font></b></p></td>';
echo '<td width="25%"align="center"><p><b><font color="#000000">Ficha</font></b></p></td>';
echo '<td width="25%"align="center"><p><b><font color="#000000">Hora</font></b></p></td>';
echo '<td width="25%"align="center"><p><b><font color="#000000">Total</font></b></p></td></tr>';
for($d=0; $d<$c; $d++){
$fecha = $fila[$d]["fecha"];
$entr_sal = $fila[$d]["entrada_salida"];
$hora = $fila[$d]["hora"];
echo '<tr>';
echo '<td width="25%" valign="top" align="center" >';
echo $fecha;
echo '</td>';
echo '<td width="25%" valign="top" align="center" >';
echo $entr_sal;
echo '</td>';
echo '<td width="25%" valign="top" align="center" >';
echo $hora;
echo '</td>';
echo '<td width="25%" valign="top" align="center" >';
if ($entr_sal = "Entrada") /*si para la fila donde estoy es entrada pues busco si la siguiente fila contiene la misma fecha.
si es asi cojo la columna hora del siguiente dia para restar la hora a la columna en que estamos situados */
{ $c=d+1;
$fecha_dia_sig = $fila[$c]["fecha"];
$ent_sal_sig = $fila[$c]["entrada_salida"];
$hora_dia_sig = $fila[$c]["hora"];
if ($fecha_dia_sig = $fecha)
{
$hora2 = $hora;
$hora1 = $hora_dia_sig;
$horat = dif(hora1,hora2);


}
else
{
echo "ese dia no fichastes salida";
}
echo '</td></tr>';
}
} // fin for;
echo '</table>';
echo '</center>';
Pero de esta forma se me estar cortando filas. Quitando todo lo que contiene el primer if me saca 4 filas (correcto) pero tal y como está este código sólo me sale 1fila.

Un saludo.
  #7 (permalink)  
Antiguo 15/10/2008, 09:22
 
Fecha de Ingreso: junio-2008
Mensajes: 56
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Ayuda con aplicación, problemas en array

CORRIJO: me cortaba porque tenia otra variable c.

Escribo codigo completo:
Cita:
$respuesta = mysql_query($cons_dias, $bbdd) or die(mysql_error());; //ejecutamos la consulta.
$filas = mysql_num_rows($respuesta); //número de filas guardadas
echo '<br>';
/*echo 'Filas encontradas: ';
echo $filas;
echo '<br>';
*/
// Guardamos resultado en un array
$c=0;
while($fila[$c] = mysql_fetch_array($respuesta))
{
$c+=1;
$fecha = $fila[$c]["fecha"];
$hora = $fila[$c]["hora"];
$in_out = $fila[$c]["entrada_salida"];

}
/*echo "Arry respuesta:<br>";
print_r($fila); // muestro lo que tengo almacenado en el array.
*/

// Trabajamos con el Array
echo '<center>';
echo '<table width="50%" border="1" >';
echo '<tr>'; //fila
echo '<td width="25%" align="center"><p><b><font color="#000000">Fecha</font></b></p></td>';
echo '<td width="25%"align="center"><p><b><font color="#000000">Ficha</font></b></p></td>';
echo '<td width="25%"align="center"><p><b><font color="#000000">Hora</font></b></p></td>';
echo '<td width="25%"align="center"><p><b><font color="#000000">Total</font></b></p></td></tr>';
for($d=0; $d<$c; $d++){
$fecha = $fila[$d]["fecha"];
$entr_sal = $fila[$d]["entrada_salida"];
$hora = $fila[$d]["hora"];
echo '<tr>';
echo '<td width="25%" valign="top" align="center" >';
echo $fecha;
echo '</td>';
echo '<td width="25%" valign="top" align="center" >';
echo $entr_sal;
echo '</td>';
echo '<td width="25%" valign="top" align="center" >';
echo $hora;
echo '</td>';
echo '<td width="25%" valign="top" align="center" >';
//echo $d; resultados 0,1,2,3,4
$cont=$d+1;
//echo $cont; resultados 1,2,3,4,5
if ($entr_sal = "Entrada") //si es Entrada paso a mirar la siguiente fila
//compruebo que la ficha de la siguiente fila sea la misma.
//de ser así tomo sus valores.
{
$fecha_dia_sig = $fila[$cont]["fecha"]; //fecha de siguiente fila


if ($fecha_dia_sig = $fecha) //si la fecha es igual cojo la hora y la paso a la funcion.
{
$ent_sal_sig = $fila[$cont]["entrada_salida"]; //valor Entrada_Salida siguiente fila.
If ($entr_sal_sig = "Salida")
{$hora_dia_sig = $fila[$cont]["hora"]; //hora siguiente fila.
$hora1 = $hora;
$hora2 = $hora_dia_sig;
$horat = dif(hora2,hora1);
echo $fecha_dia_sig;
echo $horat; //hago tramas, sólo para comprobar...
echo $hora2;
echo $hora1;

}

}
else
{
echo "ese dia no fichastes salida";
}

}

echo '</td></tr>';
} // fin for;
echo '</table>';
echo '</center>';

mysql_close();
}
?>
Pero debe ser que no me está cogiendo bien la filas, mirad los resultados:
Cita:
Fecha


----fecha----------ficha--------hora----$fecha_dia_sig--resta---$hora2----$hora1
2008-10-13 Entrada 15:16:54 2008-10-13 00:00:00 15:17:17 15:16:54
2008-10-13 Salida 15:17:17 2008-10-13 00:00:00 13:42:26 15:17:17
2008-10-14 Entrada 13:42:26 2008-10-14 00:00:00 13:45:20 13:42:26
2008-10-14 Salida 13:45:20 2008-10-14 00:00:00 16:50:12 13:45:20
2008-10-15 Entrada 16:50:12 2008-10-15 00:00:00 16:50:12
Como veis las horas no las estoy cogiendo bien o algo está fallando, porque de diferentes dias no deberia coger valores de hora del dia siguiente para eso tengo el if ($fecha = $fecha_dia_sig) -- Me tiene que restar la hora de salida menos la hora de entrada de un mismo dia. Debo poner el resultado de horas trabajadas en ese dia, me da igual que sea en la fila de entrada o en la fila de salida.

Por favor necesito AYUDAAAAAA!!!
  #8 (permalink)  
Antiguo 15/10/2008, 09:26
 
Fecha de Ingreso: junio-2008
Mensajes: 56
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Ayuda con aplicación, problemas en array

CORRIJO: me cortaba porque tenia otra variable c.

Escribo codigo completo:
Cita:
$respuesta = mysql_query($cons_dias, $bbdd) or die(mysql_error());; //ejecutamos la consulta.
$filas = mysql_num_rows($respuesta); //número de filas guardadas
echo '<br>';
/*echo 'Filas encontradas: ';
echo $filas;
echo '<br>';
*/
// Guardamos resultado en un array
$c=0;
while($fila[$c] = mysql_fetch_array($respuesta))
{
$c+=1;
$fecha = $fila[$c]["fecha"];
$hora = $fila[$c]["hora"];
$in_out = $fila[$c]["entrada_salida"];

}
/*echo "Arry respuesta:<br>";
print_r($fila); // muestro lo que tengo almacenado en el array.
*/

// Trabajamos con el Array
echo '<center>';
echo '<table width="50%" border="1" >';
echo '<tr>'; //fila
echo '<td width="25%" align="center"><p><b><font color="#000000">Fecha</font></b></p></td>';
echo '<td width="25%"align="center"><p><b><font color="#000000">Ficha</font></b></p></td>';
echo '<td width="25%"align="center"><p><b><font color="#000000">Hora</font></b></p></td>';
echo '<td width="25%"align="center"><p><b><font color="#000000">Total</font></b></p></td></tr>';
for($d=0; $d<$c; $d++){
$fecha = $fila[$d]["fecha"];
$entr_sal = $fila[$d]["entrada_salida"];
$hora = $fila[$d]["hora"];
echo '<tr>';
echo '<td width="25%" valign="top" align="center" >';
echo $fecha;
echo '</td>';
echo '<td width="25%" valign="top" align="center" >';
echo $entr_sal;
echo '</td>';
echo '<td width="25%" valign="top" align="center" >';
echo $hora;
echo '</td>';
echo '<td width="25%" valign="top" align="center" >';
//echo $d; resultados 0,1,2,3,4
$cont=$d+1;
//echo $cont; resultados 1,2,3,4,5
if ($entr_sal = "Entrada") //si es Entrada paso a mirar la siguiente fila
//compruebo que la ficha de la siguiente fila sea la misma.
//de ser así tomo sus valores.
{
$fecha_dia_sig = $fila[$cont]["fecha"]; //fecha de siguiente fila


if ($fecha_dia_sig = $fecha) //si la fecha es igual cojo la hora y la paso a la funcion.
{
$ent_sal_sig = $fila[$cont]["entrada_salida"]; //valor Entrada_Salida siguiente fila.
If ($entr_sal_sig = "Salida")
{$hora_dia_sig = $fila[$cont]["hora"]; //hora siguiente fila.
$hora1 = $hora;
$hora2 = $hora_dia_sig;
$horat = dif(hora2,hora1);
echo $fecha_dia_sig;
echo $horat; //hago tramas, sólo para comprobar...
echo $hora2;
echo $hora1;

}

}
else
{
echo "ese dia no fichastes salida";
}

}

echo '</td></tr>';
} // fin for;
echo '</table>';
echo '</center>';

mysql_close();
}
?>
Pero debe ser que no me está cogiendo bien la filas, mirad los resultados:
Cita:
Fecha


----fecha----------ficha--------hora-------$fecha_dia_sig-------resta---$hora2----$hora1
2008-10-13------ Entrada------ 15:16:54------ 2008-10-13--- 00:00:00 --- 15:17:17--- 15:16:54
2008-10-13------ Salida------ 15:17:17------ 2008-10-13--- 00:00:00--- 13:42:26--- 15:17:17
2008-10-14------ Entrada------ 13:42:26------ 2008-10-14--- 00:00:00--- 13:45:20 --- 13:42:26
2008-10-14----- Salida------ 13:45:20------ 2008-10-14--- 00:00:00 --- 16:50:12 --- 13:45:20
2008-10-15------ Entrada------ 16:50:12------ 2008-10-15--- 00:00:00 --- 16:50:12
Como veis las horas no las estoy cogiendo bien o algo está fallando, porque de diferentes dias no deberia coger valores de hora del dia siguiente para eso tengo el if ($fecha = $fecha_dia_sig) -- Me tiene que restar la hora de salida menos la hora de entrada de un mismo dia. Debo poner el resultado de horas trabajadas en ese dia, me da igual que sea en la fila de entrada o en la fila de salida.

Por favor necesito AYUDAAAAAA!!!
  #9 (permalink)  
Antiguo 15/10/2008, 10:44
 
Fecha de Ingreso: junio-2008
Mensajes: 56
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Ayuda con aplicación, problemas en array

Bueno pues despues de horas y horas y quebraderos de cabeza ya lo tengo!!

Escribo el código final por si a alguien le hiciera falta algo parecido:

Cita:
<?php
session_start();
include("configuracion.php");
if ($_SESSION['login'] == "" ) {

header("Location: index.php");
die(); // no sigo ejecutando la restante parte del script
}

include("primerdia.php");
include("restahoras.php");
$bbdd = mysql_connect($host, $usuario, $password) or die ("Could not connect: " . mysql_error()); //conectamos con base de datos.
$tablausuario = mysql_select_db($bd, $bbdd) or die(mysql_error());//seleccionamos base de datos fichaje de nuestra base de datos.
if (bbdd){
$cons_dias = 'select fecha,hora,entrada_salida from fichaje where user="'.$_SESSION[login].'" AND fecha >= "'.$primer_dia.'" ORDER BY fecha';
/* seleccionamos de la base de datos los datos que necesitaremos que serán la fecha, hora y la entrada o salida del usuario
registrado donde los registros que cogeremos sera el primer dia de la semana y los posteriores*/
//echo $cons_dias;
$respuesta = mysql_query($cons_dias, $bbdd) or die(mysql_error());; //ejecutamos la consulta.
$filas = mysql_num_rows($respuesta); //número de filas guardadas
echo '<br>';
/*echo 'Filas encontradas: ';
echo $filas;
echo '<br>';
*/
// Guardamos resultado en un array
$c=0;
while($fila[$c] = mysql_fetch_array($respuesta))
{
$c+=1;
$fecha = $fila[$c]["fecha"];
$hora = $fila[$c]["hora"];
$in_out = $fila[$c]["entrada_salida"];

}
/*echo "Arry respuesta:<br>";
print_r($fila); // muestro lo que tengo almacenado en el array.
*/

// Trabajamos con el Array
echo '<center>';
echo '<table width="75%" border="1" >';
echo '<tr>'; //fila
echo '<td width="25%"><center><p><b><font color="#000000">Fecha</font></b></p></center></td>';
echo '<td width="25%"><center><p><b><font color="#000000">Ficha</font></b></p></center></td>';
echo '<td width="25%"><center><p><b><font color="#000000">Hora</font></b></p></center></td>';
echo '<td width="25%"><center><p><b><font color="#000000">Total Horas trabajadas Dia</font></b></p></center></td></tr>';
for($d=0; $d<$c; $d++){
$fecha = $fila[$d]["fecha"];
$entr_sal = $fila[$d]["entrada_salida"];
$hora = $fila[$d]["hora"];
echo '<tr>';
echo '<td width="25%" valign="top"><center>';
echo $fecha;
echo '</center></td>';
echo '<td width="25%" valign="top"><center>';
echo $entr_sal;
echo '</center></td>';
echo '<td width="25%" valign="top"><center>';
echo $hora;
echo '</center></td>';
echo '<td width="25%" valign="top"><center>';
//echo $d; resultados 0,1,2,3,4 ok
$cont=$d+1; // Esta variable la utilizaremos para acceder a la siguiente fila.

if ($entr_sal == "Entrada") //si es Entrada paso a mirar la siguiente fila
//compruebo que la fecha de la siguiente fila sea la misma.
//de ser así tomo sus valores.

{
$fecha_dia_sig = $fila[$cont]["fecha"]; //fecha de siguiente fila

if ($fecha_dia_sig == $fecha) /*si la fecha de la siguiente fila es igual al de la fila que estamos
cogemos la hora y la paso a la funcion.*/
{
$ent_sal_sig = $fila[$cont]["entrada_salida"]; //valor Entrada_Salida siguiente fila.

$hora_dia_sig = $fila[$cont]["hora"]; //hora siguiente fila.
$hora1 = $hora;
$hora2 = $hora_dia_sig;
$horatotal = dif($hora2,$hora1);
echo $horatotal;
echo " horas";

}// fin de IF que comprueba que las fechas sean iguales.
else
{ //si la fecha del dia no es igual, significa que ese dia no ficho la salida
// ya que si un dia ficha la entrada ese dia solo puede volver a fichar la salida o no fichar.
echo "Este dia NO Fichastes la Salida!";
}

}

echo '</center></td></tr>';
} // fin for;
echo '</table>';
echo '</center>';

mysql_close();
}
?>
Ahora sólo mejorarlo visualmente y se acabó!!

Un saludo.
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 10:18.