Ver Mensaje Individual
  #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, 10 meses
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