Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Como guardar el dato anterior de un while + php ?

Estas en el tema de Como guardar el dato anterior de un while + php ? en el foro de PHP en Foros del Web. Saludos compañeros del foro, Tengo el siguiente while: Código PHP: while( $dataGames  =  $strDataGames -> fetch ( PDO :: FETCH_ASSOC )){        $dataGames [ 'Time' ...
  #1 (permalink)  
Antiguo 28/01/2014, 09:47
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Pregunta Como guardar el dato anterior de un while + php ?

Saludos compañeros del foro,

Tengo el siguiente while:
Código PHP:
while($dataGames $strDataGames->fetch(PDO::FETCH_ASSOC)){
      
$dataGames['Time'];
          
$dataGames['NumGame'];
          
$dataGames['Teams'];
          
$dataGames['Score'];
          
$dataGames['Tickets'];
          
$dataGames['Risk'];
          
$dataGames['WinLoss'];
          
$dataGames['IdGame'];                          

Todos esos datos dentro del while son los campos que me devuelve mi consulta sql, la cuestión es que quiero hacer un IF como este dentro del ciclo:
Código PHP:
while($dataGames $strDataGames->fetch(PDO::FETCH_ASSOC)){
      
       if(
$dataGames['NumGame'] == $previousNumGame && $dataGames['Teams'] == $previousTeams){
           
// HAGA LO QUE QUIERO...
       
}                                

Con este IF puedo preguntar si el dato por donde va el while es igual al que estuvo antes, entonces haga lo que quiero, pero no se como almacenar el dato que estuvo antes, alguna ayuda ??
  #2 (permalink)  
Antiguo 28/01/2014, 10:30
Avatar de luis010182  
Fecha de Ingreso: julio-2009
Ubicación: Argentina - Capital Federal
Mensajes: 382
Antigüedad: 14 años, 10 meses
Puntos: 27
Respuesta: Como guardar el dato anterior de un while + php ?

Código PHP:
$previousNumGame 0;
$previousTeams 0;
while(
$dataGames $strDataGames->fetch(PDO::FETCH_ASSOC)){
      
       if(
$dataGames['NumGame'] == $previousNumGame && $dataGames['Teams'] == $previousTeams){
           
// HAGA LO QUE QUIERO...
       

       
$previousTeams $dataGames['Teams'] ;       
       
$previousNumGame  $dataGames['NumGame'];                        

  #3 (permalink)  
Antiguo 28/01/2014, 10:42
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Pregunta Respuesta: Como guardar el dato anterior de un while + php ?

Amigo tengo esto, pero no me funciona ya que solo me devuelve un dato y son varios, ademas los campos que sumo no me estan funcionando ya que me imprimen 0, dime que cambiar... ?
Código PHP:
$conta           0;
                        
$previousNumGame "";
                        
$previousTeams   "";
                        
$previousTime    "";
                        
$previousScore   "";
                        
$counterTickets  0;
                        
$counterRisk     0;
                        
$counterWinLoss  0;
                        
$IdGames         "";
                        while(
$dataGames $strDataGames->fetch(PDO::FETCH_ASSOC)){
                           if(
$conta != 0){
                                if(
$dataGames['NumGame'] == $previousNumGame && $dataGames['Teams'] == $previousTeams){ 
                                   
$previousNumGame $dataGames['NumGame']; 
                                   
$previousTeams   $dataGames['Teams']; 
                                   
$time1 strtotime($previousTime);
                                   
$time2 strtotime($dataGames['Time']);
                                   
                                   if(
$time1 $time2)
                                      
$previousTime $dataGames['Time'];
                                   else
                                      
$previousTime $previousTime;
                                      
                                   
$previousScore   $dataGames['Score']; 
                                   
$counterTickets  $counterTickets $dataGames['Tickets']; 
                                   
$counterRisk     $counterRisk $dataGames['Risk']; 
                                   
$counterWinLoss  $counterWinLoss $dataGames['WinLoss']; 
                                   
$IdGames        .= $dataGames['IdGame']."+"
                                }else{
                                   
$response .= "<tr>";
                                   
$response .= "<td>".$previousTime."</td>";
                                   
$response .= "<td>".$previousNumGame."</td>";
                                   
$response .= "<td>".$previousTeams."</td>";
                                   
$response .= "<td>".$previousScore."</td>";
                                   
$response .= "<td><a href='#' rel='' onClick='openInfoWager(this);'>".$counterTickets."</a></td>";
                                   
$response .= "<td>".$counterRisk."</td>";
                                   
$response .= "<td>".$counterWinLoss."</td>";
                                   
                                   
$todayFigure $todayFigure $counterWinLoss// resto cuando el usuario perdio.
                                
}
                                   
$response .= "<td>".$todayFigure."</td>";
                                   
$response .= "</tr>";    
                                  
                                   
$counterTickets  0;
                                   
$counterRisk     0;
                                   
$counterWinLoss  0;
                                   
$IdGames         "";
                           }else{
                              
$previousNumGame $dataGames['NumGame']; 
                              
$previousTeams   $dataGames['Teams']; 
                              
$previousTime    $dataGames['Time'];
                              
$previousScore   $dataGames['Score']; 
                              
$counterTickets  $dataGames['Tickets']; 
                              
$counterRisk     $dataGames['Risk']; 
                              
$counterWinLoss  $dataGames['WinLoss']; 
                              
$IdGames         $dataGames['IdGame']."+"
                           }
                              
$conta += 1;
                        }
//end while 
  #4 (permalink)  
Antiguo 28/01/2014, 10:51
Avatar de luis010182  
Fecha de Ingreso: julio-2009
Ubicación: Argentina - Capital Federal
Mensajes: 382
Antigüedad: 14 años, 10 meses
Puntos: 27
Respuesta: Como guardar el dato anterior de un while + php ?

por lo que veo en tu codigo me parece que la condicion $conta == 0 se da una sola vez(la primera), despues lo unico que haces es actualizar las variables anteriores.
  #5 (permalink)  
Antiguo 28/01/2014, 10:55
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Exclamación Respuesta: Como guardar el dato anterior de un while + php ?

Amigo cambie eso que dices lee nuevamente el codigo como lo tengo...
  #6 (permalink)  
Antiguo 28/01/2014, 11:00
Avatar de luis010182  
Fecha de Ingreso: julio-2009
Ubicación: Argentina - Capital Federal
Mensajes: 382
Antigüedad: 14 años, 10 meses
Puntos: 27
Respuesta: Como guardar el dato anterior de un while + php ?

ahora lo que estas haciendo es comparar con el primer games. ya que no volves a actualizar los datos anteriores. Te imprime los

Si me explicas un poco mas de los datos y a que queres llegar capaz te puedo ayudar.
  #7 (permalink)  
Antiguo 28/01/2014, 11:01
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Exclamación Respuesta: Como guardar el dato anterior de un while + php ?

Para resumirte lo que intento hacer es que cuando el numero de juego y los equipos sean los mismos, entonces que haga la suma de los datos que quiero, cuando ya no sea igual me imprima los datos de ese juego pero con los campos correspondientes sumados, luego reinicio los campos de suma para que en el otro juego que venga se vuelva a sumar desde 0 ya que si no reinicio creo que la suma del juego anterior queda y me sumaria datos erróneos, espero explicarme bien.
  #8 (permalink)  
Antiguo 28/01/2014, 11:39
Avatar de luis010182  
Fecha de Ingreso: julio-2009
Ubicación: Argentina - Capital Federal
Mensajes: 382
Antigüedad: 14 años, 10 meses
Puntos: 27
Respuesta: Como guardar el dato anterior de un while + php ?

Lo que yo haria es primero los calculos, y despues la impresion. Osea obtene un array con lo datos y calculos que necesitas y despues solo imprimi el array.

Código PHP:
$datos = array();
while(
$dataGames $strDataGames->fetch(PDO::FETCH_ASSOC)){
    
$ident $dataGames['NumGame']."_".$dataGames['Teams'];
    if( 
array_key_exists$ident$datos ) ){
        
$datos$ident ]['Tickets'] = $datos$ident ]['Tickets'] + $dataGames['Tickets'];
        
$datos$ident ]['Risk'] = $datos$ident ]['Risk'] + $dataGames['Risk'];
        
$datos$ident ]['WinLoss'] = $datos$ident ]['WinLoss'] + $dataGames['WinLoss'];
        
$datos$ident ]['IdGame'] = $datos$ident ]['IdGame']."+".$dataGames['IdGame'];
    }
    else{
        
$datos$ident ] = $dataGames
    }

}

foreach( 
$datos as $dato ){
   
# impresion de la tabla

  #9 (permalink)  
Antiguo 28/01/2014, 11:48
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Pregunta Respuesta: Como guardar el dato anterior de un while + php ?

Amigo me parece bien pero como hago con todos los demas datos?
  #10 (permalink)  
Antiguo 28/01/2014, 11:58
Avatar de luis010182  
Fecha de Ingreso: julio-2009
Ubicación: Argentina - Capital Federal
Mensajes: 382
Antigüedad: 14 años, 10 meses
Puntos: 27
Respuesta: Como guardar el dato anterior de un while + php ?

Cita:
Iniciado por adryan310 Ver Mensaje
Amigo me parece bien pero como hago con todos los demas datos?
Que datos te faltaria?
Te explico lo que hace el while, creo un nuevo array y uso como clave de cada nuevo elemnto el nro de juego y los equipos.

Cada ves que la clave se repite, sumo lo datos nuevos a los anteriores. EL resultado seria array con un elemento por cada juego_equipos.

Si te faltan datos me decis cuales son y veo como te puedo ayudar
  #11 (permalink)  
Antiguo 28/01/2014, 13:02
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Como guardar el dato anterior de un while + php ?

Yo haria algo asi mas simple:
Código PHP:
Ver original
  1. <?php
  2.     while($dataGames = $strDataGames->fetch(PDO::FETCH_ASSOC))
  3.     {
  4.             if
  5.             (
  6.                     isset($anterior)
  7.                 &&  ($dataGames['NumGame']  == $anterior['NumGame'])
  8.                 &&  ($dataGames['Teams']    == $anterior['Teams'])
  9.             )
  10.             {
  11.                 // Aca haces lo que quieras.
  12.                
  13.                if(strtotime($anterior['Time']) < strtotime($dataGames['Time']))
  14.                   $anterior['Time'] = $dataGames['Time'];
  15.  
  16.                $anterior['Score']   =  $dataGames['Score'];
  17.                $counterTickets      += $dataGames['Tickets'];
  18.                $counterRisk         += $dataGames['Risk'];
  19.                $counterWinLoss      += $dataGames['WinLoss'];
  20.                $IdGames             .= $dataGames['IdGame']."+";
  21.             }
  22.             else
  23.             {  
  24.                 if(isset($anterior))
  25.                 {
  26.                     // Si no es el primer resultado.
  27.                    
  28.                     $todayFigure += $counterWinLoss; // resto cuando el usuario perdio.
  29.                     $response .= "<tr>
  30.                                 <td>$anterior[Time]</td>
  31.                                 <td>$anterior[NumGame]</td>
  32.                                 <td>$anterior[Teams]</td>
  33.                                 <td>$previousScore</td>
  34.                                 <td><a href=\"#\" onClick=\"openInfoWager(this);\">$counterTickets</a></td>
  35.                                 <td>$counterRisk</td>
  36.                                 <td>$counterWinLoss</td>
  37.                                 <td>$todayFigure</td>
  38.                             </tr>";
  39.                 }
  40.                
  41.                 // Preparar las variables para la proxima ronda.
  42.                 $counterTickets     = 0;
  43.                 $counterRisk        = 0;
  44.                 $counterWinLoss     = 0;
  45.                 $IdGames            = "";
  46.                 $anterior           = $dataGames;
  47.             }
  48.     }
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #12 (permalink)  
Antiguo 28/01/2014, 13:37
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Exclamación Respuesta: Como guardar el dato anterior de un while + php ?

Amigo NSD tu recomendacion me sirve ya que me agrupa los datos por numero de juego y por equipos, lo que pasa es que no me salen los Scores ni me suma los datos ya que me sale 0 en todos
  #13 (permalink)  
Antiguo 28/01/2014, 13:53
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Exclamación Respuesta: Como guardar el dato anterior de un while + php ?

Amigo ahorita lo tengo asi, y me sale todo menos los campos calculados osea los que sumamos,
Código PHP:
while($dataGames $strDataGames->fetch(PDO::FETCH_ASSOC)){
    if(isset(
$anterior) &&  ($dataGames['NumGame']  == $anterior['NumGame'])&&  ($dataGames['Teams']    == $anterior['Teams'])){
                            
// Aca haces lo que quieras.
                           
if(strtotime($anterior['Time']) < strtotime($dataGames['Time']))
                               
$anterior['Time']     =  $dataGames['Time'];
                               
$anterior['Score']    =  $dataGames['Score'];
                               
$counterTickets      +=  $dataGames['Tickets'];
                               
$counterRisk         +=  $dataGames['Risk'];
                               
$counterWinLoss      +=  $dataGames['WinLoss'];
                               
$IdGames             .=  $dataGames['IdGame']."+";
                            }elseif(isset(
$anterior)){
                                    
// Si no es el primer resultado.
                                    
                                    
$todayFigure += $counterWinLoss;
                                    
$response .= "<tr>
                                                <td>$anterior[Time]</td>
                                                <td>$anterior[NumGame]</td>
                                                <td>$anterior[Teams]</td>
                                                <td>$anterior[Score]</td>
                                                <td><a href=\"#\" onClick=\"openInfoWager(this);\">$counterTickets</a></td>
                                                <td>$counterRisk</td>
                                                <td>$counterWinLoss</td>
                                                <td>$todayFigure</td>
                                            </tr>"
;
      }
                                
                                
// Preparar las variables para la proxima ronda.
                                
$counterTickets     0;
                                
$counterRisk        0;
                                
$counterWinLoss     0;
                                
$IdGames            "";
                                
$anterior           $dataGames;
    
}
//end while 
  #14 (permalink)  
Antiguo 28/01/2014, 17:13
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Como guardar el dato anterior de un while + php ?

Ese codigo no es el que yo te pase. Tiene una pequeña gran diferencia y es por eso que no suma.

Codigo original:
Código PHP:
Ver original
  1. }
  2.             else
  3.             {  
  4.                 if(isset($anterior))
  5.                 {
  6.                     // Si no es el primer resultado

tu codigo:
Código PHP:
Ver original
  1. }elseif(isset($anterior)){
  2.                                     // Si no es el primer resultado.

no es lo mismo una cosa que la otra.

Los contadores solo se inicializan a 0 cuando se inicia un nuevo bloque, esto ocurre al encontrar el segundo resultado o cuando cambian los valores de numGame o Teams, en tu codigo, se inicializan ciempre por lo que no llevan la cuenta de nada y ciempre valen 0.

la variable $todayFigure nose de donde sale, esa ya estaba.

Lo que quieres hacer, se conoce como "Corte de control" si no tienes claro este concepto, te recomiendo que lo repases y que hagas 1 o 2 ejercicios para tomarle la mano. no es dificil (de hecho es algo bastante basico) pero todo tu problema se resume a aplicar bien este concepto. saludos.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #15 (permalink)  
Antiguo 28/01/2014, 17:22
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Pregunta Respuesta: Como guardar el dato anterior de un while + php ?

Amigo tenias razon pero tengo un inconveniente, todos los calculos van un numero atras osea si son 6 tickets me imprime 5 y asi con los demas calculos, podrias decirme a que se debe esto y como solucionarlo ??
  #16 (permalink)  
Antiguo 28/01/2014, 18:12
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Respuesta: Como guardar el dato anterior de un while + php ?

Amigo aun no soluciono mi problema, alguna ayuda ??
  #17 (permalink)  
Antiguo 29/01/2014, 09:28
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Como guardar el dato anterior de un while + php ?

Tienes que revisar un poco el codigo y debuggerarlo tu mismo, no esperes que los demas te hagamos el trabajo.

Si razonas el funcionamiento de un corte de control veras que no debes trabajar directamente con el ultimo registro a mostrar, sino con el anterior, y es precisamente sobre este que debes tener que poner controles. Cambiando un poco la logica de los if (para mayor claridad) quedaria asi:

Código PHP:
Ver original
  1. <?php
  2.     while($dataGames = $strDataGames->fetch(PDO::FETCH_ASSOC))
  3.     {
  4.         if ( isset($anterior) )
  5.         {
  6.             // Si hay un aterior trabajamos con el. Esto se hace ciempre.
  7.            $counterTickets      += $anterior['Tickets'];
  8.            $counterRisk         += $anterior['Risk'];
  9.            $counterWinLoss  += $anterior['WinLoss'];
  10.            $IdGames             .= $anterior['IdGame']."+";    
  11.        
  12.             // Verificamos la similitud con el anterior. Si coinciden hago lo que quiero.
  13.             if
  14.             (       ($dataGames['NumGame']  == $anterior['NumGame'])
  15.                 &&  ($dataGames['Teams']    == $anterior['Teams'])
  16.             )
  17.             {
  18.                if(strtotime($anterior['Time']) < strtotime($dataGames['Time']))
  19.                   $anterior['Time'] = $dataGames['Time'];
  20.      
  21.                $anterior['Score']   =  $dataGames['Score'];
  22.             }
  23.             else
  24.             {  
  25.                 $todayFigure += $counterWinLoss; // Resto cuando el usuario perdio.
  26.                 $response .= "<tr>
  27.                             <td>$anterior[Time]</td>
  28.                             <td>$anterior[NumGame]</td>
  29.                             <td>$anterior[Teams]</td>
  30.                             <td>$anterior[Score]</td>
  31.                             <td><a href=\"#\" onClick=\"openInfoWager(this);\">$counterTickets</a></td>
  32.                             <td>$counterRisk</td>
  33.                             <td>$counterWinLoss</td>
  34.                             <td>$todayFigure</td>
  35.                         </tr>";
  36.                        
  37.                 // Borrar el anterior.
  38.                 unset($anterior);
  39.             }      
  40.         }
  41.        
  42.     // Si hay un aterior trabajamos con el. Esto se hace ciempre.
  43.         if ( !isset($anterior) )
  44.         {
  45.             // Preparar las variables para la proxima ronda.
  46.             $counterTickets     = 0;
  47.             $counterRisk        = 0;
  48.             $counterWinLoss     = 0;
  49.             $IdGames            = "";
  50.             $anterior           = $dataGames;
  51.         }
  52.     }

El algoritmo tiene 2 grandes bugs. El primero se soluciono (no lo hice intencionalmente) al cambiar la estructura de los if, que es cuando un hay un solo numGame o un solo numTeam.

El otro bug que vas a solucionar tu solo, es cuando el ultimo registro pertenece a un nuevo numTeam o numGame. Este algoritmo lo guardaria como anterior, pero nunca lo procesaria.

Pista 1 (Solucion elegante): Se puede solucionar dentro del while agregando 2 variables booleanas. Una de ella pasara a ser la condicion del while y debe ser inicializada correctamente la primera vez. Para esta solucion basta agregar 5 lineas al final del while, una unica antes de que se inicie, y modificar la condicion del while por la variable booleana que agregaste en la linea anterior.

+ Claro
+ Simple
+ Consistente
+ Portable
+/- Escalable

Pista 2: (Solucion mediocre): No tocar el while, agregar un if luego de este para ver si se trata de este caso, preguntando si esta o no.

- Claro
++ Simple
- Cosistente
+/- Portable
-- Escalable

Pista 3: (Solucion elegante, escalable, perfeccionista): Es un destilado de la primer solucion, la diferencia es que aqui no usaras 2 variables booleanas sino una sola, y una funcion axuliar para mostrar los datos. La primer linea y la condicion del while se cambian igual que en la primera, el echo de la fila de la tabla se mete en una funcion auxiliar que recibe por parametro las variables, donde esta el echo se remplaza por una llamada a la funcion, y, dentro de el bloque que pregunta si el $anterior no esta seteado, se agregan 2 lineas mas, un if que pregunta por la variable booleana, si es falso, llama a la funcion de mostrar.

+ Claro
+/- Simple
++ Consistente
+/- Portable (Hay dependencia de una funcion auxiliar.)
++ Escalable

Pista 4 (Solucion profesional): Sin duda la mejor de todas. Modificar la consulta SQL para que haga todo esto y hacer un while simple que muestre los resultados obtenidos.

Pistas N: Puedes hacer cualquier hibrido que se te ocurra entre estas tres opciones.

No te voy a poner codigo, piensa y razona tu, en el peor de los casos, son 10 lineas de codigo que hay que agregar y en el mejor 5. Tu puedes.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 29/01/2014 a las 09:43
  #18 (permalink)  
Antiguo 29/01/2014, 10:03
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Pregunta Respuesta: Como guardar el dato anterior de un while + php ?

Amigo pero como voy a meter en el while una condicion booleana ?? cuando la pase a true un ejemplo me va a detener el while y van a quedar campos afuera o no ?
  #19 (permalink)  
Antiguo 29/01/2014, 13:31
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Pregunta Respuesta: Como guardar el dato anterior de un while + php ?

Amigo, aun no logro entenderte podrias explicarme mejor en donde esta mi problema exactamente ??
  #20 (permalink)  
Antiguo 29/01/2014, 14:07
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Como guardar el dato anterior de un while + php ?

Cita:
Iniciado por adryan310 Ver Mensaje
Amigo, aun no logro entenderte podrias explicarme mejor en donde esta mi problema exactamente ??
Aquí tienes tu respuesta:

Cita:
Iniciado por NSD Ver Mensaje
Tienes que revisar un poco el codigo y debuggerarlo tu mismo, no esperes que los demas te hagamos el trabajo.
[...]
No te voy a poner codigo, piensa y razona tu, en el peor de los casos, son 10 lineas de codigo que hay que agregar y en el mejor 5. Tu puedes.
Trata de hacerlo por ti mismo, acaso no eres programador? con la información que te dieron es más que suficiente. ¿No eres capaz? lee, documentate y practica... Si no no tendría sentido que todo se te dé hecho.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #21 (permalink)  
Antiguo 29/01/2014, 15:02
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Como guardar el dato anterior de un while + php ?

Cita:
Amigo, aun no logro entenderte podrias explicarme mejor en donde esta mi problema exactamente ??
Tu problema esta cuando los datos son de este tipo:


Código PHP:
Ver original
  1. $dataGames[0] = array('NumGame' => 1, 'Teams' => 2);
  2. $dataGames[1] = array('NumGame' => 1, 'Teams' => 2);
  3. $dataGames[2] = array('NumGame' => 2, 'Teams' => 3);
  4. $dataGames[3] = array('NumGame' => 2, 'Teams' => 3);
  5. $dataGames[4] = array('NumGame' => 5, 'Teams' => 7); // Una o las dos condiciones, son diferentes del anterior y es la ultima fila.

El ultimo caso, quedara sin ser procesado, dicho de otra forma, sera ignorado.

Cita:
como voy a meter en el while una condicion booleana ?? cuando la pase a true un ejemplo me va a detener el while y van a quedar campos afuera o no ?
Sabes lo que es un while? pareciera que no.
Es una estructura repetitiva que mientras su condicion pueda ser EVALUADA como true, ejecuta el bloque de codigo que tiene asociado.

Sabes que es lo que estas haciendo con esta instruccion:
Código PHP:
Ver original
  1. $dataGames = $strDataGames->fetch(PDO::FETCH_ASSOC)
Lee el manual si no entiendes.
$strDataGames tiene todos los resultados que vinieron de la base de datos. ¿Alguna vez recorriste un archivo secuencialmente? (Si la respuesta es no, ya es hora que lo vayas haciendo) La idea es la misma. En un archivo tu decias while not EOF() do que vendria a ser: mientras no sea fin de archivo hacer y adentro del while leias una linea del archivo, el puntero interno del archivo avanza una posicion y apunta o a EOF o al siguiente registro.

el metodo fetch es muy similar, en lugar de un archivo toma el resultset que viene de la base de datos, pone el puntero apuntando al primer registro, cada vez que se ejecuta, si ese puntero apunta a un resultado, devuelve ese resultado como un array, y lo avanza una posicion, si el puntero apunta al EOF retorna false.

En el manual la seccion booleanos explica que valores en php son evaluados como falsos.

un array vacio es falso, pero un array lleno es true.

php primero evalua la asignacion y luego el while:
1-> Resuelve la funcion fetch (puede ser un array o false)
2-> Asigna ese valor a $dataGames
3-> Evalua el valor de $dataGames como condicion del while

esta haciendo una convercion implicita para resolver la variable como si fuese booleana y poder trabajarla.

while evalua CIEMPRE una condicion booleana, que esa condicion salga de una variable o de una exprecion, le da lo mismo.

Código PHP:
Ver original
  1. // Osea que esto:
  2. while( /* exprecion */ )
  3.  
  4. // Es lo mismo que esto
  5. $varBoolean = (bool)  (/* exprecion */);
  6. while($varBoolean)

Sin embargo hay una gran diferencia entre ambos, y es que en el segundo caso, el valor de $varBoolean puede ser modificado y actualizado en cualquier lugar, no solo al inicio del while, puedes modificarla en cualquier lugar tantas veces como quieras, hasta puedes hacerla tomar diferentes significados segun donde la metas.
Esa propiedad es la que te sugiero que aproveches.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #22 (permalink)  
Antiguo 29/01/2014, 15:24
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Pregunta Respuesta: Como guardar el dato anterior de un while + php ?

Gracias por tu respuesta amigo, mira llevo ya varios dias en este problema y entiendo que debo hacerlo yo, soy principiante en esto de PHP por eso caso no lo entiendo. Te agradezco enormemente la ayuda que me has brindado. Tengo entre muchas una duda en especifico, lo que me dices tu es que el error esta cuando llega al ultimo dato o cuando por ejemplo solo sale una vez el NumGame y el Teams ?
osea:
Código PHP:
$dataGames[0] = array('NumGame' => 1'Teams' => 2);
$dataGames[1] = array('NumGame' => 1'Teams' => 2);
$dataGames[2] = array('NumGame' => 2'Teams' => 3);
$dataGames[3] = array('NumGame' => 2'Teams' => 3);
$dataGames[4] = array('NumGame' => 5'Teams' => 7); // asi 
o
Código PHP:
$dataGames[0] = array('NumGame' => 1'Teams' => 2);
$dataGames[1] = array('NumGame' => 1'Teams' => 2);
$dataGames[2] = array('NumGame' => 2'Teams' => 3);
$dataGames[3] = array('NumGame' => 2'Teams' => 3);
$dataGames[4] = array('NumGame' => 5'Teams' => 7);
$dataGames[5] = array('NumGame' => 5'Teams' => 7);
$dataGames[6] = array('NumGame' => 6'Teams' => 6); // asi
$dataGames[7] = array('NumGame' => 7'Teams' => 8);
$dataGames[8] = array('NumGame' => 7'Teams' => 8); 
Amigo enserio te agradezco pero soy muy amateur en PHP
  #23 (permalink)  
Antiguo 29/01/2014, 15:33
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Como guardar el dato anterior de un while + php ?

Mira, al menos, por favor, lee las respuestas que te doy. Si a la primera te dejan dudas (ya se que no son muy claras a veces) leelas 2 o 3 veces antes de repreguntar.

Cita:
$dataGames[4] = array('NumGame' => 5, 'Teams' => 7); // Una o las dos condiciones, son diferentes del anterior y es la ultima fila
En eso creo que fui claro. Sobre todo en la parte de que debe ser la ultima fila. en tu segundo caso no vas a notar el bug, ya que es igual a la anteultima, el problema, como mencione arriba es cuando Una o las dos condiciones, son diferentes del anterior y es la ultima fila
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #24 (permalink)  
Antiguo 29/01/2014, 15:42
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Exclamación Respuesta: Como guardar el dato anterior de un while + php ?

Amigo le he estado hechando un poco cabeza y ha mejorado un poco, pero aun no me funka mira lo que tengo:
Código PHP:
$conta           0;
                        
$counterTickets  0;
                        
$counterRisk     0;
                        
$counterWinLoss  0;
                        
$IdGames         "";
                        while(
$dataGames $strDataGames->fetch(PDO::FETCH_ASSOC)){
                            if (isset(
$anterior) ){
                                
// Si hay un aterior trabajamos con el. Esto se hace ciempre.
                                
if($conta == 0){
                                   
$counterTickets      += $anterior['Tickets'];
                                   
$counterRisk         += $anterior['Risk'];
                                   
$counterWinLoss      += $anterior['WinLoss'];
                                   
$IdGames             .= $anterior['IdGame']."+";
                                   
                                   
$conta ++;  
                                   
error_log("TICKETS EN PRIMER IF: Juego# ".$anterior['NumGame']." - ".$counterTickets);
                                }
                                
// Verificamos la similitud con el anterior. Si coinciden hago lo que quiero.
                                
if(($dataGames['NumGame']  == $anterior['NumGame']) && ($dataGames['Teams'] == $anterior['Teams'])){
                                       
$counterTickets      += $anterior['Tickets'];
                                       
$counterRisk         += $anterior['Risk'];
                                       
$counterWinLoss      += $anterior['WinLoss'];
                                       
$IdGames             .= $anterior['IdGame']."+";   
                               
                                   if(
strtotime($anterior['Time']) < strtotime($dataGames['Time']))
                                      
$anterior['Time'] = $dataGames['Time'];
                                      
                                      
$anterior['Score']   =  $dataGames['Score'];
                                      
                                     
// error_log("TICKETS EN SEGUNDO IF: Juego# ".$anterior['NumGame']." - ".$counterTickets);
                                
}else{   
                                      
$todayFigure += $counterWinLoss;
                                      
//error_log("TICKETS EN TERCER IF: Juego# ".$anterior['NumGame']." - ".$counterTickets);
                                      
$response .= "<tr>
                                                     <td>$anterior[Time]</td>
                                                     <td>$anterior[NumGame]</td>
                                                     <td>$anterior[Teams]</td>
                                                     <td>$anterior[Score]</td>
                                                     <td><a href=\"#\" onClick=\"openInfoWager(this);\">$counterTickets</a></td>
                                                     <td>$counterRisk</td>
                                                     <td>$counterWinLoss</td>
                                                     <td>$todayFigure</td>
                                                    </tr>"
;
                                       
// Borrar el anterior.
                                       
unset($anterior);
                                     }       
                            }
                            
                        
// Si hay un aterior trabajamos con el. Esto se hace ciempre.
                            
if ( !isset($anterior) ){
                                
// Preparar las variables para la proxima ronda.
                                
$counterTickets     0;
                                
$counterRisk        0;
                                
$counterWinLoss     0;
                                
$conta 0;
                                
$IdGames            "";
                                
$anterior           $dataGames;
                            }
                        }
//end while 
  #25 (permalink)  
Antiguo 29/01/2014, 15:52
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Como guardar el dato anterior de un while + php ?

Por la velocidad en que respondes no parece que te hallas esforzado mucho.

1-> la variable $conta no tiene razon de existir.
2-> las 4 lineas que agregaste al inicio del while tampoco.
3-> Hay una contradicion:

Código PHP:
Ver original
  1. // Si hay un aterior trabajamos con el. Esto se hace ciempre.
  2.                                 if($conta == 0){

o se hace siempre o se hace cuando $conta == 0 una de dos.

ningun cambio que hiciste (salvo quiza las funciones de debug) tienen mucho sentido.

agregaste 9 lineas y ninguna es relevante.

aqui te entregue servidas las dos lineas que tienes que cambiar al inicio. Pense que eso lo copiarias y lo usarias, pero parece que ni siquiera lo haz mirado.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #26 (permalink)  
Antiguo 29/01/2014, 15:59
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Sonrisa Respuesta: Como guardar el dato anterior de un while + php ?

Compañero de nuevo gracias, pero la verdad leo todos tus links y comentarios los trato de entender lo mas que pueda y no logro como llegarle a la solución que tu me recomendastes, ya hasta diagrame en un cuaderno este proceso y no encuentro como solucionarlo, soy demasiado novato en PHP la verdad y se que tienes razón en lo que me comentas pero ya me tiene cerrado y con dolor de cabeza este error
  #27 (permalink)  
Antiguo 29/01/2014, 16:43
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Exclamación Respuesta: Como guardar el dato anterior de un while + php ?

Amigo se que me has ayudado mucho y me has dado muchas pistas con la solución de mi problema, pero hechame la mano hermano con esto es lo único que me falta para terminar y son días los que llevo con esto
  #28 (permalink)  
Antiguo 29/01/2014, 17:18
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Como guardar el dato anterior de un while + php ?

Código PHP:
Ver original
  1. <?php
  2. // Funcion que muestra los datos.
  3.     function showFila(&$response, $anterior, $counterTickets, $counterRisk, $counterWinLoss, $todayFigure)
  4.    {
  5.                 $response .= "<tr>
  6.                            <td>$anterior[Time]</td>
  7.                            <td>$anterior[NumGame]</td>
  8.                            <td>$anterior[Teams]</td>
  9.                            <td>$anterior[Score]</td>
  10.                            <td><a href=\"#\" onClick=\"openInfoWager(this);\">$counterTickets</a></td>
  11.                            <td>$counterRisk</td>
  12.                            <td>$counterWinLoss</td>
  13.                            <td>$todayFigure</td>
  14.                        </tr>";
  15.     }
  16. // Variable
  17.     $estado = (bool) ($dataGames = $strDataGames->fetch(PDO::FETCH_ASSOC));
  18. // El while
  19.     while($estado)
  20.     {
  21.         if ( isset($anterior) )
  22.         {
  23.             // Si hay un aterior trabajamos con el. Esto se hace ciempre.
  24.            $counterTickets      += $anterior['Tickets'];
  25.            $counterRisk         += $anterior['Risk'];
  26.            $counterWinLoss  += $anterior['WinLoss'];
  27.            $IdGames             .= $anterior['IdGame']."+";    
  28.        
  29.             // Verificamos la similitud con el anterior. Si coinciden hago lo que quiero.
  30.             if
  31.             (       ($dataGames['NumGame']  == $anterior['NumGame'])
  32.                 &&  ($dataGames['Teams']    == $anterior['Teams'])
  33.             )
  34.             {
  35.                if(strtotime($anterior['Time']) < strtotime($dataGames['Time']))
  36.                   $anterior['Time'] = $dataGames['Time'];
  37.      
  38.                $anterior['Score']   =  $dataGames['Score'];
  39.             }
  40.             else
  41.             {  
  42.                 $todayFigure += $counterWinLoss; // Resto cuando el usuario perdio.
  43.                // ahora se usa la funcion
  44.                 showFila($response, $anterior, $counterTickets, $counterRisk, $counterWinLoss, $todayFigure);
  45.                        
  46.                 // Borrar el anterior.
  47.                 unset($anterior);
  48.             }      
  49.         }
  50.        
  51.         if ( !isset($anterior) )
  52.         {
  53.             // Preparar las variables para la proxima ronda.
  54.             $counterTickets     = 0;
  55.             $counterRisk        = 0;
  56.             $counterWinLoss     = 0;
  57.             $IdGames            = "";
  58.             $anterior           = $dataGames;
  59.         }
  60.        
  61.         // Si es el ultimo.
  62.         if(!($estado = (bool) ($dataGames = $strDataGames->fetch(PDO::FETCH_ASSOC))))
  63.                 showFila($response, $anterior, $counterTickets, $counterRisk, $counterWinLoss, $todayFigure);
  64.     }
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #29 (permalink)  
Antiguo 29/01/2014, 17:26
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Exclamación

Amigo gracias por tu ayuda, pero aun con el cambio que me distes, me sigue sumando lo mismo analice tu codigo y si esta muy bien, pero no se por que no me suma bien los datos, me da igual que antes de cambiarlo...

No se por que no me funciona las sumas bien

Amigo puedes ayudarme con este problema no encuentro donde esta mi error

Última edición por GatorV; 31/01/2014 a las 09:03
  #30 (permalink)  
Antiguo 30/01/2014, 21:32
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Como guardar el dato anterior de un while + php ?

Hola, publica el codigo completo del script e indica que es lo que anda mal. quizas alguien se solidarize y te señale la falla, yo ya hice bastante por ti.

Suena duro, pero romperte la cabeza contra el lenguaje y la logica, entender como funciona por dentro, saber como son los hilos del programa que vas tejiendo, encotrar los errores y depurarlos, revisar un codigo que funciona 20 veces hasta encontrar como mejorarlo aunque sea un poquito, lograr saber sin dudas lo que hara un programa si le modificas algo pero sin hacer la modificacion, ver un procedimiento e imaginar 3 formas alternativas de realizarlo, evaluar sus ventajas y contras, decidirse por el correcto y decidirse bien, son cosas que llevan tiempo, años de practica constante, la diferencia entre un programador y los simples mortales, es que a nosotros nos apasiona esto, cada obstaculo, cada falla, cada error, es un nuevo aprendizaje, cada bug nos hace mas fuertes, generamos anticuerpos y con el tiempo ya no sufrimos de las dolencias de determinadas fallas, las predecimos y solucionamos inconscientemente.

Si a ti no te apaciona esto, no te iluciona llegar a ser un gran programador, no el mejor, solo uno bueno, tan bueno como te sea posible, no sientes el ferviente deseo de encontrar tu mismo la falla y decir "Lo hice yo, y no nesesite la ayuda de ese patan presumido de NSD para hacerlo" entonces quizas deberías considerar contratar a un profesional para que haga al trabajo por ti.

Saludos.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: dato, 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 13:41.