Foros del Web » Programando para Internet » PHP »

Como compactar codigo

Estas en el tema de Como compactar codigo en el foro de PHP en Foros del Web. Buen día foro Necesito de su ayuda para poder compactar un codigo, la situación es que es para un proyecto pero me solicitaron no pasar ...
  #1 (permalink)  
Antiguo 01/02/2013, 09:34
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Pregunta Como compactar codigo

Buen día foro

Necesito de su ayuda para poder compactar un codigo, la situación es que es para un proyecto pero me solicitaron no pasar de cierto numero de lineas de codigo,
me podrian apoyar a compactar este codigo.

Código PHP:
Ver original
  1. if($cantidad>0 && $cantidad<=100):
  2.       $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad=100";
  3.       $precio=$this->uniqueValue($query) : return $precio->precio; ? return null;      
  4. endif;

Este codigo pero se repite como 12 veces con distintos rangos de cantidades y en la consulta el precio cambia.

De antemano muchas gracias
__________________
Lo imposible solo cuesta un poco mas
  #2 (permalink)  
Antiguo 01/02/2013, 09:38
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Como compactar codigo

Yo probaría a usar una función donde la cantidad y el precio sean parámetros.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 01/02/2013, 09:39
 
Fecha de Ingreso: septiembre-2012
Ubicación: Argentina
Mensajes: 144
Antigüedad: 11 años, 7 meses
Puntos: 12
Respuesta: Como compactar codigo

buenas

Primero que nada ese codigo lo podes hacer en un script php

y requerirlo la veces que quieras (Primero que nada eso es muy util y solo con una linea incluis todo un script php).

Despues segun lo que dices con distintos rangos y cantidades tendriamos que verlo para saber
  #4 (permalink)  
Antiguo 01/02/2013, 09:41
Avatar de informacionsys  
Fecha de Ingreso: mayo-2011
Ubicación: Bogota D.C
Mensajes: 793
Antigüedad: 12 años, 11 meses
Puntos: 76
Respuesta: Como compactar codigo

hola

mm para podrias usar una funcion por ejemplo:

Código PHP:
Ver original
  1. function Comprobar($cantidad,$maximo,$codigo)
  2. {
  3.  
  4.     if($cantidad>0 && $cantidad<=$maximo):
  5.        $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad=$maximo";
  6.       $precio=$this->uniqueValue($query) ? $precio->precio : null;  
  7.       return $precio;
  8.    endif;
  9. }
  10.  
  11. // simplemente llamas la funcion pasandole los parametros ,
  12.  
  13. Comprobar(5,100,20);
  #5 (permalink)  
Antiguo 01/02/2013, 09:48
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Como compactar codigo

Graicas por responder.

Es correcto lo que dicen, yo lo tengo en una funcion pero no se como hacer para que me arroje los rangoas dinamicos.

La situacion es que de la tabla de precios se manda el codigo y se manda la cantidad ingresada, esta cantidad no siempre sera cerrada es decir no siempre sera de 100 o 200 puede ser de 23 o 187 por dar ejemplos.

Entonces no se como hacer para poder crear dependiendo el rango haga un where distinto.

por ejemplo yo lo tengo de esta forma:

Código PHP:
Ver original
  1. public function retornaPrecio($codigo,$cantidad){
  2.         if($cantidad>0 && $cantidad<=100):
  3.             $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad=100";
  4.             if($precio=$this->uniqueValue($sql)): return $precio->precio;  else: return null;
  5.             endif;      
  6.         endif;        
  7.     }

Espero haberme explicado bien
__________________
Lo imposible solo cuesta un poco mas

Última edición por jandrogdz; 01/02/2013 a las 09:53
  #6 (permalink)  
Antiguo 01/02/2013, 10:00
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Como compactar codigo

Malenko No puedo pasar el precio como parametro porque es el dato que necesito obtener de la base de datos
__________________
Lo imposible solo cuesta un poco mas
  #7 (permalink)  
Antiguo 01/02/2013, 10:04
Avatar de informacionsys  
Fecha de Ingreso: mayo-2011
Ubicación: Bogota D.C
Mensajes: 793
Antigüedad: 12 años, 11 meses
Puntos: 76
Respuesta: Como compactar codigo

no entiendo muy tu caso, como asi dependiendo el rango haga un where distinto , explicate un poco mas desglosado
  #8 (permalink)  
Antiguo 01/02/2013, 10:14
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Como compactar codigo

Si por ejemplo mira el codigo mas o menos va quedando asi:

Código PHP:
Ver original
  1. public function retornaPrecio($codigo,$cantidad){
  2.         if($cantidad>0 && $cantidad<=100):
  3.             $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad=100";
  4.             if($precio=$this->uniqueValue($sql)): return $precio->precio;  else: return null;
  5.             endif;      
  6.         endif;        
  7.         if($cantidad>100 && $cantidad<=200):
  8.             $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad=200";
  9.             if($precio=$this->uniqueValue($sql)): return $precio->precio;  else: return null;
  10.             endif;
  11.         endif;
  12.         if($cantidad>200 && $cantidad<=300):
  13.             $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad=300";
  14.             if($precio=$this->uniqueValue($sql)): return $precio->precio;  else: return null;
  15.             endif;
  16.         endif;
  17.         if($cantidad>300 && $cantidad<=500):
  18.             $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad=500";
  19.             if($precio=$this->uniqueValue($sql)): return $precio->precio;  else: return null;
  20.             endif;
  21.         endif;

Lo que necesito es que los rangos sean dinamicos y que el valor de la cantidad del where tmbn sea dinamico peor no tengo idea de como hacerlo.
La cantiad ya esta guardada en la base de datos:
La tabla de precio tiene precioID,cantidad,precio,productoID

Espero haberme dado a entender
__________________
Lo imposible solo cuesta un poco mas
  #9 (permalink)  
Antiguo 01/02/2013, 10:24
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Como compactar codigo

Puedes usar un switch:
Código PHP:
Ver original
  1. switch(true) {
  2.       case $cantidad <= 100:
  3.               $qty = 100;
  4.       case $cantidad <= 200:
  5.               $qty = 200;
  6.               break;
  7.        case $cantidad <= 300;
  8.               $qty = 300;
  9.               break;
  10. }
  11. $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad=$qty";
  12. if($precio=$this->uniqueValue($sql)): return $precio->precio;  else: return null;

Saludos.
  #10 (permalink)  
Antiguo 01/02/2013, 10:30
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Como compactar codigo

Por pura duda GatorV no habria problema por ejemplo al poner 25 y que agarre otro precio ya que 25 es menor a 200.

Simple duda
__________________
Lo imposible solo cuesta un poco mas
  #11 (permalink)  
Antiguo 01/02/2013, 10:36
Avatar de informacionsys  
Fecha de Ingreso: mayo-2011
Ubicación: Bogota D.C
Mensajes: 793
Antigüedad: 12 años, 11 meses
Puntos: 76
Respuesta: Como compactar codigo

hummm si viste el primer ejemplo que te di de la funcion ,y si le pasas el maximo como parametro , es decir el 200 o el 100 , la cuestion es que ese valor de donde lo obtienes siempre va hacer asi , 100 200 o 300?
  #12 (permalink)  
Antiguo 01/02/2013, 10:42
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Como compactar codigo

Ese valor viene de la base de datos y si siempre seran esos, pero lo que tengo que hacer es la cantidad que ingresa el cliente compararla con la cantidad de la base de datos para poder retornar el precio.
__________________
Lo imposible solo cuesta un poco mas
  #13 (permalink)  
Antiguo 01/02/2013, 10:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Como compactar codigo

A mi código al primero le falta un break; jeje, pero no, los switches se evaluan de arriba a abajo (como todo el código) por lo que si pones primero tus opciones más cortas ahí se quedan, en el caso de 25, al evaluar el primer case, va a dar true y ahí va a quedar.

Saludos.
  #14 (permalink)  
Antiguo 01/02/2013, 10:51
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Como compactar codigo

Ok muchas gracias a todos por su ayuda de verdad aprendi algo nuevo en los switches que puedes hacer validaciones dobles. y gracias a todos por sus consejos me hicieron volar mas ideas ya he conseguido compactarloe me ahorre hasta un 60% de lineas de codigo a la forma en la que yo lo tenia.

Quedo de la siguiente forma:

Código PHP:
Ver original
  1. private function comprobar($cantidad){
  2.         switch($cantidad):
  3.             case $cantidad>0 && $cantidad<=100:  return 100; break;
  4.             case $cantidad>100 && $cantidad<=200:  return 200; break;
  5.             case $cantidad>200 && $cantidad<=300:  return 300; break;
  6.             case $cantidad>300 && $cantidad<=500:  return 500; break;
  7.             case $cantidad>500 && $cantidad<=1000:  return 1000; break;
  8.             case $cantidad>1000 && $cantidad<=2000:  return 2000; break;
  9.             case $cantidad>2000 && $cantidad<=3000:  return 3000; break;
  10.             case $cantidad>3000 && $cantidad<=4000:  return 4000; break;
  11.             case $cantidad>4000 && $cantidad<=5000:  return 5000; break;
  12.             case $cantidad>5000 && $cantidad<=6000:  return 6000; break;
  13.             case $cantidad>6000 && $cantidad<=8000:  return 8000; break;
  14.             case $cantidad>8000 && $cantidad<=10000:  return 10000; break;
  15.         endswitch;
  16.     }
  17.    
  18.     public function retornaPrecio($codigo,$cantidad){
  19.         $nuevaCantidad=$this->comprobar($cantidad);
  20.         $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad='$nuevaCantidad'";
  21.         $precio=$this->uniqueValue($sql);
  22.         $precio ? $precio->precio : null;  
  23.         return $precio;  
  24.     }

Otra pregunta como puedo hacer para que en el metodo retornPrecio hacer un if mas compacto.
Intente asi:

Pero me dice que la variable $precio no existe
Código PHP:
Ver original
  1. $nuevaCantidad=$this->comprobar($cantidad);
  2.         $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad='$nuevaCantidad'";
  3.         $precio=$this->uniqueValue($sql) ? $precio->precio : null;  
  4.         return $precio;

y en el where trate de hacer esto pero no funciono

Código PHP:
Ver original
  1. $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad='$this->comprobar($cantidad)'";
__________________
Lo imposible solo cuesta un poco mas
  #15 (permalink)  
Antiguo 01/02/2013, 10:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Como compactar codigo

No es necesario que pongas la condición doble, si lo haces como te indiqué primero solo es necesario que uses la condición mayor y con eso basta .

Respecto a tu if, puedes probar algo así:
Código PHP:
Ver original
  1. $precio = ($rowPrecio = $this->uniqueValue($sql) !== null) ? $rowPrecio->precio: null;

Saludos.
  #16 (permalink)  
Antiguo 01/02/2013, 11:05
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Como compactar codigo

GatorV. me sigue mandando el mismo error. COn tu ejemplo
__________________
Lo imposible solo cuesta un poco mas
  #17 (permalink)  
Antiguo 01/02/2013, 11:08
Avatar de informacionsys  
Fecha de Ingreso: mayo-2011
Ubicación: Bogota D.C
Mensajes: 793
Antigüedad: 12 años, 11 meses
Puntos: 76
Respuesta: Como compactar codigo

hola

prueba asi:

Código PHP:
Ver original
  1. $rowPrecio = $this->uniqueValue($sql);
  2. $precio = ($rowPrecio !== null && empty($rowPrecio)) ? $rowPrecio->precio : null;
  #18 (permalink)  
Antiguo 01/02/2013, 11:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Como compactar codigo

¿Que tipo de dato devuelve $this->uniqueValue?
  #19 (permalink)  
Antiguo 01/02/2013, 12:19
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Como compactar codigo

Ese switch duele a los ojos...

Código PHP:
Ver original
  1. private function comprobar($cantidad){
  2.         $temp=(1+(intval($cantidad/100)))*100;
  3.          return $temp<8001?$temp:10000;
  4.       }
  #20 (permalink)  
Antiguo 01/02/2013, 12:24
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Como compactar codigo

Y si lo quieres hacer aún más compacto:
Código PHP:
Ver original
  1. public function retornaPrecio($codigo,$cantidad){      
  2.         $sql="SELECT precio FROM precio WHERE productoID='$codigo' AND cantidad= IF(FLOOR($cantidad/100)<8,(1+FLOOR($cantidad/100))*100,10000)";
  3.         $precio=$this->uniqueValue($sql);
  4.         $precio ? $precio->precio : null;  
  5.         return $precio;  
  6.     }
  #21 (permalink)  
Antiguo 01/02/2013, 13:05
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Como compactar codigo

dashtrash

Me podrias explicar el proceso de esa funcion pork aun no logro captar como es el funcionamiento
__________________
Lo imposible solo cuesta un poco mas
  #22 (permalink)  
Antiguo 01/02/2013, 13:23
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Como compactar codigo

Tu switch lo único que hace es calcular, dado un número, en qué rango de los múltiplos de 100 está.
La parte entera de la división del número entre 100, va a ser 0 para numeros entre 0 y 99.1 para numeros entre 100 y 199, etc.
Asi que, si a esa parte entera le sumas 1 y lo multiplicas por 100, tienes el límite superior que buscas.
Como, por algún motivo, si es superior a 8000, devuelves 10000 (si es superior, la función con los switch no devuelve nada, lo cual generaría un error), le añado esa condición.
  #23 (permalink)  
Antiguo 01/02/2013, 14:39
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Como compactar codigo

entonces esa funcion hace la tarea de todo el switch?
__________________
Lo imposible solo cuesta un poco mas
  #24 (permalink)  
Antiguo 01/02/2013, 15:23
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Como compactar codigo

Si.Y en el siguiente post que he puesto, no necesitas ni la función con el switch.Se calcula dentro de la query.El parser mysql lo considerará una constante, por lo que no afectará al rendimiento.
  #25 (permalink)  
Antiguo 01/02/2013, 17:39
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Como compactar codigo

Funcionará crear la cadena de la consulta e inmediatamente retornar el valor?... debería!

Código PHP:
Ver original
  1. return ($precio = $this->uniqueValue($sql)) ? $precio->precio : null;

Me extraña que tengas límite en la cantidad de líneas, tal vez el proyecto es escolar.
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: select, sql
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:16.