Foros del Web » Programando para Internet » PHP »

optimizar proceso php mediante ciclos o bucles?

Estas en el tema de optimizar proceso php mediante ciclos o bucles? en el foro de PHP en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original //Buscamos toda la data relacionada con los avances del usuario para su posterior uso $user_progress = $conexion -> prepare ...
  #1 (permalink)  
Antiguo 29/06/2016, 12:02
 
Fecha de Ingreso: diciembre-2015
Mensajes: 115
Antigüedad: 8 años, 11 meses
Puntos: 2
Pregunta optimizar proceso php mediante ciclos o bucles?

Código PHP:
Ver original
  1. //Buscamos toda la data relacionada con los avances del usuario para su posterior uso
  2. $user_progress=$conexion->prepare("SELECT u.points AS puntos, u.level AS reputacion, FROM usuarios u WHERE u.id=? LIMIT 1");
  3. $user_progress->bind_param('i',$user_id);
  4. $user_progress->execute();
  5. $user_progress->store_result();
  6. $user_progress->bind_result($points,$level);
  7. $user_progress->fetch();
  8.  
  9. //variables a usar
  10. $actual_value=$points;
  11. $max_value= 1000;
  12. //calculo del porcentaje de avance para alcanzar el siguiente nivel
  13. $percent = floor($actual_value*100/$max_value);
  14.  
  15. //Calculamos el nivel de reputacion del usuario y su avance basandonos en sus puntos actuales
  16.  
  17. if     ($actual_value>=1000 and $actual_value<3000)   { $max_value= 3000; $percent =  floor($actual_value*100/$max_value);   $levelup=1; }
  18. elseif ($actual_value>=3000 and $actual_value<6000)   { $max_value= 6000; $percent =  floor($actual_value*100/$max_value);   $levelup=2; }
  19. elseif ($actual_value>=6000 and $actual_value<9000)   { $max_value= 9000; $percent =  floor($actual_value*100/$max_value);   $levelup=3; }
  20. elseif ($actual_value>=9000 and $actual_value<14000)  { $max_value= 14000; $percent = floor($actual_value*100/$max_value);   $levelup=4; }
  21. elseif ($actual_value>=14000 and $actual_value<18000) { $max_value= 18000; $percent = floor($actual_value*100/$max_value);   $levelup=5; }
  22. elseif ($actual_value>=18000 and $actual_value<23000) { $max_value= 23000; $percent = floor($actual_value*100/$max_value);   $levelup=6; }
  23. elseif ($actual_value>=23000 and $actual_value<28000) { $max_value= 28000; $percent = floor($actual_value*100/$max_value);   $levelup=7; }
  24. elseif ($actual_value>=28000 and $actual_value<36000) { $max_value= 36000; $percent = floor($actual_value*100/$max_value);   $levelup=8; }
  25. elseif ($actual_value>=36000 and $actual_value<50000) { $max_value= 50000; $percent = floor($actual_value*100/$max_value);   $levelup=9; }
  26. elseif ($actual_value>=50000 and $actual_value<60000) { $max_value= 60000; $percent = floor($actual_value*100/$max_value);   $levelup=10;}
  27.  
  28. if ($level!=0) {
  29. //Subimos el nivel del usuario
  30. $update_level=$conexion->prepare("UPDATE usuarios SET level=? WHERE user=?");
  31. $update_level->bind_param('is', $levelup, $username);
  32. $update_level->execute();
  33. $update_level->close();
  34. }

estoy implementando el siguiente codigo para lo que es llevar el control del nivel de reputacion que tienen los usuarios de mi web y sus avances en forma de porcentaje... (todo esto, es calculado en base a los puntos que posean)

el codigo funciona perfectamente, sin embargo... lo he hecho bajo lo que se, y lo considero un tanto manual y rustico si se quiere... hay alguna forma de simplificar lo que alli hice mediante el uso de ciclos?

y otra duda.... al subir de nivel me gustaria guardar dicho avance en una tabla llamada 'actividad' la cual ya he creado, el detalle esta en que no se como hacer la consulta de insercion SOLO y unicamente cuando un usuario avance de nivel...
  #2 (permalink)  
Antiguo 29/06/2016, 12:18
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: optimizar proceso php mediante ciclos o bucles?

Optimizar no significa usar menos código, o loops, de hecho es todo lo contrario.

Si un loop puede evitarse es mucho mejor, hacer cada llamada a mano es lo más eficiente del mundo, y si puedes descender aún más en el lenguaje estará cada vez más optimizado.

Comienza por C, y cuando tengas experiencia ya podrás escribir tus páginas web en ensamblador.

Ahora, si quieres "simplificar" tu código es una cosa aparte.

Claro que puedes simplificar las llamadas manuales con un loop, pero primero debes estructurar los datos, ya cuando tengas las estructuras de datos hechas será más fácil hacer el loop, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 29/06/2016, 20:59
 
Fecha de Ingreso: diciembre-2015
Mensajes: 115
Antigüedad: 8 años, 11 meses
Puntos: 2
Respuesta: optimizar proceso php mediante ciclos o bucles?

interesante... tenia entendido que a menos codigo mayor rendimiento, mi error... gracias
  #4 (permalink)  
Antiguo 30/06/2016, 02:09
 
Fecha de Ingreso: febrero-2016
Mensajes: 36
Antigüedad: 8 años, 9 meses
Puntos: 2
Respuesta: optimizar proceso php mediante ciclos o bucles?

Cita:
Iniciado por kukiko11 Ver Mensaje
Código PHP:
Ver original
  1. //Buscamos toda la data relacionada con los avances del usuario para su posterior uso
  2. $user_progress=$conexion->prepare("SELECT u.points AS puntos, u.level AS reputacion, FROM usuarios u WHERE u.id=? LIMIT 1");
  3. $user_progress->bind_param('i',$user_id);
  4. $user_progress->execute();
  5. $user_progress->store_result();
  6. $user_progress->bind_result($points,$level);
  7. $user_progress->fetch();
  8.  
  9. //variables a usar
  10. $actual_value=$points;
  11. $max_value= 1000;
  12. //calculo del porcentaje de avance para alcanzar el siguiente nivel
  13. $percent = floor($actual_value*100/$max_value);
  14.  
  15. //Calculamos el nivel de reputacion del usuario y su avance basandonos en sus puntos actuales
  16.  
  17. if     ($actual_value>=1000 and $actual_value<3000)   { $max_value= 3000; $percent =  floor($actual_value*100/$max_value);   $levelup=1; }
  18. elseif ($actual_value>=3000 and $actual_value<6000)   { $max_value= 6000; $percent =  floor($actual_value*100/$max_value);   $levelup=2; }
  19. elseif ($actual_value>=6000 and $actual_value<9000)   { $max_value= 9000; $percent =  floor($actual_value*100/$max_value);   $levelup=3; }
  20. elseif ($actual_value>=9000 and $actual_value<14000)  { $max_value= 14000; $percent = floor($actual_value*100/$max_value);   $levelup=4; }
  21. elseif ($actual_value>=14000 and $actual_value<18000) { $max_value= 18000; $percent = floor($actual_value*100/$max_value);   $levelup=5; }
  22. elseif ($actual_value>=18000 and $actual_value<23000) { $max_value= 23000; $percent = floor($actual_value*100/$max_value);   $levelup=6; }
  23. elseif ($actual_value>=23000 and $actual_value<28000) { $max_value= 28000; $percent = floor($actual_value*100/$max_value);   $levelup=7; }
  24. elseif ($actual_value>=28000 and $actual_value<36000) { $max_value= 36000; $percent = floor($actual_value*100/$max_value);   $levelup=8; }
  25. elseif ($actual_value>=36000 and $actual_value<50000) { $max_value= 50000; $percent = floor($actual_value*100/$max_value);   $levelup=9; }
  26. elseif ($actual_value>=50000 and $actual_value<60000) { $max_value= 60000; $percent = floor($actual_value*100/$max_value);   $levelup=10;}
  27.  
  28. if ($level!=0) {
  29. //Subimos el nivel del usuario
  30. $update_level=$conexion->prepare("UPDATE usuarios SET level=? WHERE user=?");
  31. $update_level->bind_param('is', $levelup, $username);
  32. $update_level->execute();
  33. $update_level->close();
  34. }

estoy implementando el siguiente codigo para lo que es llevar el control del nivel de reputacion que tienen los usuarios de mi web y sus avances en forma de porcentaje... (todo esto, es calculado en base a los puntos que posean)

el codigo funciona perfectamente, sin embargo... lo he hecho bajo lo que se, y lo considero un tanto manual y rustico si se quiere... hay alguna forma de simplificar lo que alli hice mediante el uso de ciclos?

y otra duda.... al subir de nivel me gustaria guardar dicho avance en una tabla llamada 'actividad' la cual ya he creado, el detalle esta en que no se como hacer la consulta de insercion SOLO y unicamente cuando un usuario avance de nivel...
Solo un pequeño consejo, si basas la reputación en los porcentajes, aplicales a todos el valor maximo de puntos, porque sino, resulta que tiene mas reputación el que tiene 2999 que el que tiene 3000 (es solo por ponerte un ejemplo, haz los cálculos sobre tu codigo). Ademas de esta forma asignas solamente una vez un valor a la variable $max_value.

Sobre como hacer una inserción en una tabla, encontraras bastante información por el foro, y para que solo realice esa operación cuando haya una subida de nivel, tendrás que usar una sentencia de control, que compare el valor viejo con el actual, y si es mayor, que almacene ese nuevo valor en la tabla.

A nivel de código, yo lo simplificaría mas, para que comprobar si esta entre 2 valores? Comprueba solo si es menor que el valor máximo, y si se cumple sales de la secuencia de elseif con un goto. (muchos diran que no les gusta, pero es una orden valida si se usa con cabeza)

Tendrías algo así:

SI Puntos<3000 {Tu código y un goto fin}
SI Puntos<6000 {Tu código y un goto fin}
.
.
.
fin:
resto de código;

Esto seria así si son muchos usuarios los de nivel bajo, te ahorrara algo de tiempo de proceso de la CPU. Pero bueno, esto dependerá del numero total de usuarios que vayan a usar la aplicación, sino, es insignificante.

Última edición por ica1977; 30/06/2016 a las 02:16

Etiquetas: ciclos, mediante, proceso, select, tabla, usuarios, variable
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 06:19.