Comunidad de diseño web y desarrollo en internet online

problema con calculo en un script

Citar            
MensajeEscrito el 02 Sep 2009 12:17 am
Estimados,

Estoy desarrollando una aplicación en php y tengo el siguiente problema en el cual me encuentro estancado y creo que puede haber una solucion mas facil al de hacer mucho código con varias validaciones, en realiad he tratado de resolver el problema con pocas lines en una extructura de control y no puedo.

El problema es el siguiente.

Tengo un script que hara recargas de cells y las recargas solo se pueden hacer por diferentes valores y si quiero hacer una recarga que no comprenda los valores que pudeo ejecutar conta la compañia de celulares tendría que hacer un grupo de recargas donde la suma de ellas me den el valor de la recarga.



Hay q tener en cuenta q devo de hacer la minima cantidad de transacciones por lo que siempre debo de usar los valores mas altos.
Ej.

Valores de recarga:

$valores_de_recargas = array (10, 25, 50, 100, 200, 300,500);

Supongamos que un cliente quiere recargas 1775 $.

El resultado sería q tengo q hacer 3 cargas de 500 $ una de 200 $ una de 50 $ y otra de 25 $.

El tema q no me sale el script q haga eso.

si alguien me puede ayudar se lo agradezco.

Por steeben

8 de clabLevel



 

01-01-07

firefox
Citar            
MensajeEscrito el 02 Sep 2009 02:00 am
amigos ya lo resolvi de esta forma talves no es la mas sencilla, me gustaria sus comentarios y q otra opcion puede ser para resolver eso
gracias

Por steeben

8 de clabLevel



 

01-01-07

firefox
Citar            
MensajeEscrito el 02 Sep 2009 02:34 am
Hola, bueno creo que lo planteas puede resolverse con el siguiente script:

Código PHP :

//este nuevo array contempla todos los posibles valores
   //de una carga, a diferencia del que posteaste
   //que no permitia carga por ej. $1772.
   $valores_de_recargas = array(1,5,10,25,50,100,200,300,500);
   
   //aca pondremos el nro de cargas por valor de recarga
   //que debemos realizar.
   $nro_cargas = array();
   
   $carga = 1775; //monto a cargar.
   $i=count($recargas)-1;
   
   
   echo 'Para cargar '.$carga.' son necesarias: <br/>';
   while ($i>-1 && $carga>0) { //mientras haya carga y valores de recarga
      $cargas=floor($carga/$recargas[$i]); //nro de cargas
      if ($cargas>0) {
         $nro_cargas[$recargas[$i]] = $cargas;
         echo $cargas.' cargas de $'.$recargas[$i].'<br/>';
      } 
      //decremento el valor de la carga.
      $carga = $carga - $recargas[$i]*$cargas;
      $i--; 
   }


Cualquier cosa me avisas si funcionó ok, saludos.

Por bucle_infinito

Claber

166 de clabLevel

1 tutorial

 

.NET Developer

firefox
Citar            
MensajeEscrito el 02 Sep 2009 02:41 am
Una aclaración por cierto, al principio le cambie el nombre del array tal como lo posteaste tu o sea $valores_de_recargas, pero por si copias y pegas el codigo, quiero aclararte que la variable $recargas deberia llamarse en realidad $valores_de_recargas asi no te da error ok. Yo lo probé con ese nombre solo que al postearlo solamente le cambie al inicio y me olvide de reflejar los cambios en las demas apariciones.
Saludos

Por bucle_infinito

Claber

166 de clabLevel

1 tutorial

 

.NET Developer

firefox
Citar            
MensajeEscrito el 02 Sep 2009 02:48 am
Muchas gracias y mas por la pronta respuesta yo lo habia resuelto de esta forma q me falto postear arriba de todos modos me voy a fijar cual es mas optima muchas gracias.


Código PHP :

$RechargeValues            = array (10,25,50,100,200,300,500);
   $RechVal = array_reverse ( $RechargeValues );
   $MinValue= 10;
   $Amount = 451;
   $Amount2 = $Amount;
   $Iterar  = true;
   $i=1;
   while ($Iterar) {
      if($Amount2 >= current ($RechVal) ) {
         $Amount2-=current ($RechVal ) ;
         $Current +=current($RechVal); 
         echo "Recargar: ".current($RechVal)."<br>";
      }
      else if (current($RechVal) == $MinValue ) {
         $Iterar = false;
         echo "Puede recargar: ".$Current."<br>";
         echo "Saldo:".($Amount - $Current)."<br>";
         echo "Entre $i veces";
      } else {
         next ($RechVal);
      }
      $i++;   
   }

Por steeben

8 de clabLevel



 

01-01-07

firefox
Citar            
MensajeEscrito el 02 Sep 2009 02:53 am
Bien lo acabo de probar y funciona muy bien gracias!

Por steeben

8 de clabLevel



 

01-01-07

firefox
Citar            
MensajeEscrito el 02 Sep 2009 02:56 am
Ahora q veo en detalle lo q posteastes de q con el array q yo puse no se pueda hacer recargas de 1772, es que la compañia contra la cual consumo el servicio solo tiene esos valores de recarga, o sea q voy a tener que hacer una transaccion por cada una y primer decirle al usuario si se pued hacer la recarga q ingreso o no y sugerirle la mas cercana.

Por steeben

8 de clabLevel



 

01-01-07

firefox
Citar            
MensajeEscrito el 02 Sep 2009 03:02 am
Ok, me alegra haberte ayudado, saludos

Por bucle_infinito

Claber

166 de clabLevel

1 tutorial

 

.NET Developer

firefox
Citar            
MensajeEscrito el 02 Sep 2009 03:05 am
Bue, ahora me surge otro problema.

Esto funciona asi:
para una recarga de 1775 necesito hacer 3 transacciones de 500$, una de 200$, una de 50$ y otra de 25$.
un total de 6 transacciones.

El tema q surge con esto es que para cargas mayores de 99 pesos, quemo pines virtuales o sea tarjetas que tengo encriptadas en una base de datos. y para menores de 99 una cuenta de minicargas que no se termina q es una cuenta con la operadora de telefonía.

Lo que puede pasar q las tarjetas de uno de los siguientes rangos (100, 200, 300 y 500) se agoten y no pueda usarla y tenga q usar otras y no seria conveniente q si el valor es muy alto haga un grupo de transaccioes muy grande con montos menores de 100.

Espero haber explicado el problema.

Por steeben

8 de clabLevel



 

01-01-07

firefox
Citar            
MensajeEscrito el 02 Sep 2009 03:07 am
Bucle_Infinito: Ya que veo que andas volando te consulto lo siguiente para otra compañia necesito usar el protocolo ISO-8385 alguna idea? gracias igual aun no lo empece
saludos

Por steeben

8 de clabLevel



 

01-01-07

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.