Ver Mensaje Individual
  #12 (permalink)  
Antiguo 27/10/2006, 14:23
laulaurys
 
Fecha de Ingreso: junio-2005
Mensajes: 337
Antigüedad: 19 años, 9 meses
Puntos: 1
Hola!!
estoy tratando de modificar lo siguiente en algunos casos:
Código PHP:
function realiza_operacion $cu_op 
{   
                    global 
$acum_total;

   
$operacion $cu_op;  // definimos una variable $operacion que contendrá como valor la operación que le pasamos a la función 
   
$pos 0// esta variable es la posición desde donde vamos a comparar, es decir desde el principio 

   
if ( !is_int $operacion ) ) // si no es un número entero es decir, un número sólo como 50 hacemos las operaciones 
   
{  // recorremos cada caracter de la variable $operacion para detectar que operaciones realizar (algo así como recorrer letra por letra) 
      
for ( $y 0$y strlen $operacion ); $y++ ) 
      {   
         
$operaciones = array ( '+''-''*''/' ); // definimos un array con las operaciones validas suma, resta, ... 

         
for ( $x $x count $operaciones ); $x++ ) 
         {   
            if ( 
substr $operacion$pos) == $operaciones[$x] ) // comparamos si el caracter es igual a una operacion de ser así lo guardamos en un array 
            
{   
               
// si encontro una operación guardamos su posicion y la operacion separados por coma 
               
$op[] = $pos.",".substr $operacion$pos);   
            }   
         }   
         
$pos += 1// aumentamos una unidad a la posición para comparar el siguiente carácter 
      
}   

      
$contador 1// nos indicará cuantas operaciones ya hemos realizado 

      // Esta variable nos servirá para ir sumando los resultados después de realizar una operacion ya que no las hará todas de un sólo jalon 
      // se irán resolviendo por pares ejemplo 5+2-1/2 primero resolverá 5+2 y luego la variable acumula contendrá ahora 7 a esto le restaremos 
      // 1 y acumula contendrá ahora 6 luego se dividirá entre 2 y finalmente acumula contendrá 3 
      
$acumula 0

      for ( 
$e 0$e count ($op); $e++ ) // realizamos un bucle que se repetirá tantas veces como operaciones tengamos 
      
{  // con esto dividimos el contenido del array $op[$e] ya que si recordamos guardamos su posicion y la operacion separados por coma 
         
$divide explode ","$op[$e] ); 
         
// ahora el array $divide[0] será la posición del símbolo de la operación a realizar 
         // y $divide[1] será el símbolo de la operación ( "+" por decir un ejemplo ) 

         
if ( $e != count $op ) - // si aún no es la última operación 
         
{   
            
$siguiente explode ","$op[$e 1] );   
            
// obtenemos la posición de la siguiente operación para así realizar la anterior, me explico, si tenemos esta operación 5+2-3 
            // vamos a realizar primero 5+2 pero para poder realizarlo debemos saber que posición ocupa la siguiente operacion en este caso 
            // el símbolo de la sig. operación se encuentra en la posición 4 (-) 
            
$sig_operacion $siguiente[0] + 1
         }   
         else 
// si es la última operación a realizar 
         
{   
            
$sig_operacion strlen $operacion ) - ( $divide[0] + ); // obtenemos la cadena restante 
         
}   

         if ( 
$contador == // es la primera operación a realizar 
         
{   
            
$calcula[] = substr $operacion0$divide[0] ); // obtenemos el primer número para la operacion en el ejemplo de 5+2 obtendríamos 5 
            
$calcula[] = substr $operacion$divide[0] + 1$sig_operacion ); // obtenemos el segundo num. para la operación en el ej. sería 2 

            
switch ( $divide[1] ) // hacemos la operación correspondiente recuerda que $divide[1] es el simbolo "+" en el caso de nuestro ejemplo 
            
{   
               case 
'+'// si $divide[1] contiene el símbolo + realizaremos una suma 
                  
$resultado $calcula[0] + $calcula[1];   
                  break;   
               case 
'-'// si $divide[1] contiene el símbolo - realizaremos una resta 
                  
$resultado $calcula[0] - $calcula[1];   
                  break;   
               case 
'*'// si $divide[1] contiene el símbolo * realizaremos una multiplicación 
                  
$resultado $calcula[0] * $calcula[1];   
                  break;   
               case 
'/'// si $divide[1] contiene el símbolo / realizaremos una división 
                  
$resultado $calcula[0] / $calcula[1];   
                  break;   
               default: 
// si $divide[1] no contiene ninguno de los símbolos mandamos un mensaje 
                  
echo '<p>No es una operación valida.</p>';   
                  break;   
            }   

            
$acumula $resultado// le pasamos el resultado a acumula 
            
$contador += 1// sumamos una unidad a la variable $contador para indicar que ya se hizo la primera operación 
         
}   
         else 
// si es más de una operación a realizar 
         
{   
            
$calcula substr $operacion$divide[0] + 1$sig_operacion ); // obtenemos el sig. número con el que realizar la operación 

            
switch ( $divide[1] ) // hacemos la siguiente operación (- en caso de nuestro ejemplo) con el resultado acumulado y el sig. número ( 3 en el ejemplo ) 
            

               case 
'+':   
                  
$resultado $acumula $calcula;   
                  break;   
               case 
'-':   
                  
$resultado $acumula $calcula;   
                  break;   
               case 
'*':   
                  
$resultado $acumula $calcula;   
                  break;   
               case 
'/':   
                  
$resultado $acumula $calcula;   
                  break;   
               default:   
                  echo 
'<p>No es una operación valida.</p>';   
                  break;   
            }   
            
$acumula $resultado;   
         }   
      }   

      
$operacion $acumula// le asignamos a la variable $operación el resultado final 
      
return $operacion;    
   }    
   else 
// si es un número entero sólo lo pasamos así (No realizamos ninguna operación) 
   
{   
      return 
$operacion;   
   }   
}  

$resucon mysql_query $sqlcon$dbi );  

while ( 
$filacon mysql_fetch_array $resucon ) )  

// $formula son las operaciones a realizar, mejor definela como un array para que así se te  
   // agreguen solitas sin necesidad de ponerlas a mano así  
   
$operaciones[] = $filacon["for_id"]; 
   
$formu $filacon["for_id"]; 
   
$con_codigo=$filacon["con_codigo"];
   
$con_nombre=$filacon["con_nombre"];
   
$con_descripcion=$filacon["con_descripcion"];
   
$con_id=$filacon["con_id"];
   
$tco_id=$filacon["tco_id"];

   
// con $operaciones[] definimos $operaciones como un array y en cada iteración del bucle while  
   // se irán agregando las operaciones dentro de este array  

if ($con_id=='10'
    {
// si con_id=10 es que hay antiguedad, la voy a calcular buscando la fecha de ingreso
$sqlantiguedad="SELECT emp_id,DATE_FORMAT(hbr_empleado.emp_fecha_ingreso, '%Y-%m-%d') AS emp_fecha_ingreso FROM hbr_empleado WHERE emp_legajo='$legajo'";
                        
$resuantiguedad=mysql_query($sqlantiguedad,$dbi);
                        
$filaantiguedad=mysql_fetch_array($resuantiguedad);
                        
$ingreso=$filaantiguedad["emp_fecha_ingreso"];
                        
$empleado_id=$filaantiguedad["emp_id"];
                                     
$fecha_actual=date("Y-m-j");
     list(
$Yi$mi$di)=explode('-'$ingreso);
     list(
$Yf$mf$df)=explode('-'$fecha_actual);
     
$cant_dias=((mktime 000$mf$df$Yf)- mktime 000$mi$di$Yi))/(60*60*24*365));
                        
      
$operaciones[$t]=($formu floor($cant_dias));
               
$antiguedad=($formu floor($cant_dias));
                    
                        
echo 
"antiguedad $antiguedad";
                         
             } 
// fin del if con_id=10

for ( $t 0$t count $operaciones ); $t++ ) 
{  
// le pasamos la operación a realizar a la función realiza_operacion() y el resultado se almacenará en la variable $op_resuelta 


   
$op_resuelta realiza_operacion $operaciones[$t] );

  
// echo "operacion t realiza_operacion ($operaciones[$t])";
//   echo " opera $op_resuelta "; 
if ($con_id=='10')
            { 
                
$op_resuelta=$antiguedad;
               
$acum_total += $op_resuelta;
                echo 
" op resue $acum_total";
            }

//   echo "El resultado de la operación ".$operaciones[$t]." es: ".$op_resuelta."<br/>"; // mostramos en pantalla la operación que se hizo y su resultado 

   
$acum_total += $op_resuelta// le sumamos el resultado de la operación a la variable $acum_total 
   
echo "paso 2 $acum_total";
}
   echo 
"El resultado de la operación ".$operaciones[$t]." es: ".$op_resuelta."<br/>"// mostramos en pantalla la operación que se hizo y su resultado 


}  
echo 
"<p>La suma total de todas las operaciones es: ".$acum_total;   
?> 
El tema es que solamente logro que me muestre el valor de la operacion incluyendo el if ($con_id==10) antes del $acum_total += $op_resuelta;, pero de todas formas no me suma el acumulador.
es como sino se cumpliera el for para ese caso .
Tengo que asignarselo a otra variable?
Gracias!

Última edición por Cluster; 27/10/2006 a las 14:25 Razón: Coloreado de sintax usando el botón "php"