2010-11-09 4 views
0

Je construis un journal de poids simple, où il y a une table qui affiche la progression de l'utilisateur. J'utilise Codeigniter.PHP foreach boucle où deux valeurs sont comparées

<?php foreach($logs as $log) : ?> 
     <tr> 
     <td><?php echo $log->date ;?></td> 
     <td><?php echo $log->weight ;?> kg.</td> 
     <td><!-- variation between this record and previous record. weigth[a] - weight[b] --></td> 
     <td></td> 
     <td><?php echo anchor('logs/edit/'.$log->id, 'Editar'); ?> <?php echo anchor('logs/delete/'.$log->id, 'Delete'); ?></td> 
     </tr> 
    <?php endforeach ;?> 

Je suis en train de calculer la variation entre la première ligne et la deuxième ligne, de manière à obtenir la perte ou gain de poids entre les journaux. Je me demandais comment accéder à l'enregistrement précédent de la boucle pour le soustraire du poids de l'enregistrement en cours.

--------------------------------------- 
    DATE  | WEIGHT | VARIATION 
--------------------------------------- 
    Nov 20 | 70 kg |  -1 kg  << LAST LOGGED WEIGHT, FIRST IN ARRAY 
....................................... 
    Nov 15 | 71 kg |  - 
--------------------------------------- 
+0

Ajout d'une représentation rapide du résultat de la boucle – Landitus

Répondre

5

Une façon simple de le faire:

<?php $previousWeight = null; ?> 
<?php foreach($logs as $log) : ?> 
    <tr> 
    <td> 
     <?php 
      if ($previousWeight) { 
       echo $previousWeight - $log->weight; 
      } 
      $previousWeight = $log->weight; 
     ?> 
    </td> 
    </tr> 
<?php endforeach; ?> 

Ou, le chemin inverse:

<?php 
    $current = current($logs); 
    $next = next($logs); 
?> 
<?php while ($current) : ?> 
    <tr> 
     <td><?php echo $current->date; ?></td> 
     ... 
     <td> 
      <?php 
       if ($next) { 
        echo $current->weight - $next->weight; 
       } 
      ?> 
     </td> 
    </tr> 
    <?php 
     $current = $next; 
     $next = next($logs); 
    ?> 
<?php endwhile; ?> 

Si vos clés du tableau sont garantis numérique (dont ils sont sans doute), Cela peut être simplifié beaucoup. Voir @William's answer.

+0

Cela semble fonctionner, bien que la première variation de la table soit vide quand elle ne devrait pas l'être. La dernière variation de la table doit être vide car il n'y a pas de poids précédent pour la comparer. C'est comme si la colonne de variation devait avoir une sorte de compensation. – Landitus

+0

@Landitus Désolé, je ne comprends pas. Si vous voulez comparer à l'enregistrement précédent, bien sûr, la * première * ligne sera vide, puisque la * première * ligne n'a pas d'enregistrement * précédent * Pouvez-vous clarifier exactement ce que vous voulez? – deceze

+0

Je suppose que ma confusion vient avec le tableau, qui est trié par date de façon à ce que le dernier poids enregistré soit la première valeur de la table (ou du tableau). Ainsi, le dernier poids enregistré est en haut et a une valeur de clé de 0. Cela signifie que le premier poids enregistré est au bas de la table et c'est pourquoi il ne devrait pas avoir de valeur de variation (ni poids précédent) – Landitus

1

Vous pouvez essayer d'utiliser l'option key => value pour foreach (here). Cela vous donnerait l'index actuel dans le journal, donc trouver l'index précédent serait index = ($key == 0) ? $key : ($key - 1); $old_weight = $logs[$index]; (la syntaxe pourrait être un peu éteinte, mais l'idée est là).

+0

Votre réponse suppose des index numériques consécutifs. Ce qui est probablement le cas (échantillon de code donné) mais vaut la peine d'expliciter. –

+0

J'essaie cette approche aussi bien celle fournie par deceze (qui me semble plus claire au début). – Landitus