web-dev-qa-db-fra.com

PHP: Comment déterminez-vous chaque Nième itération d'une boucle?

Je voulais faire écho à une image tous les 3 articles via XML, voici mon code:

<?php
// URL of the XML feed.
$feed = 'test.xml';
// How many items do we want to display?
//$display = 3;
// Check our XML file exists
if(!file_exists($feed)) {
  die('The XML file could not be found!');
}
// First, open the XML file.
$xml = simplexml_load_file($feed);
// Set the counter for counting how many items we've displayed.
$counter = 0;
// Start the loop to display each item.
foreach($xml->post as $post) {
  echo ' 
  <div style="float:left; width: 180px; margin-top:20px; margin-bottom:10px;">
 image file</a> <div class="design-sample-txt">'. $post->author.'</div></div>
';

  // Increase the counter by one.
  $counter++;
  // Check to display all the items we want to.
  if($counter >= 3) {
    echo 'image file';
    }
  //if($counter == $display) {
    // Yes. End the loop.
   // break;
  //}
  // No. Continue.
}
?>

voici un exemple 3 premiers sont corrects mais maintenant il ne boucle pas idgc.ca/web-design-samples-testing.php

52
kwek-kwek

La façon la plus simple est d'utiliser l'opérateur de division de module.

if ($counter % 3 == 0) {
   echo 'image file';
}

Comment cela fonctionne: la division du module renvoie le reste. Le reste est toujours égal à 0 lorsque vous êtes à un multiple pair.

Il y a un hic: 0 % 3 est égal à 0. Cela pourrait entraîner des résultats inattendus si votre compteur démarre à 0.

138
Powerlord

En partant de la réponse de @ Powerlord,

"Il y a un hic: 0% 3 est égal à 0. Cela pourrait entraîner des résultats inattendus si votre compteur démarre à 0."

Vous pouvez toujours démarrer votre compteur à 0 (tableaux, requêtes), mais le compenser

if (($counter + 1) % 3 == 0) {
  echo 'image file';
}
10
Hatrix

Utilisez l'opération arithmétique modulo trouvée ici dans le manuel PHP.

par exemple.

$x = 3;

for($i=0; $i<10; $i++)
{
    if($i % $x == 0)
    {
        // display image
    }
}

Pour une compréhension plus détaillée des calculs de module, cliquez sur ici .

9
Greg B

tous les 3 messages?

if($counter % 3 == 0){
    echo IMAGE;
}
5
mateusza

Et si: (($ counter% $ display) == 0)

2
Ivar

J'utilise cette mise à jour de statut pour afficher un caractère "+" toutes les 1000 itérations, et cela semble bien fonctionner.

if ($ucounter % 1000 == 0) { echo '+'; }
2
meme

Vous pouvez également le faire sans module. Réinitialisez simplement votre compteur lorsqu'il correspond.

if($counter == 2) { // matches every 3 iterations
   echo 'image-file';
   $counter = 0; 
}
1
Julez

Cela ne fonctionnera pas pour la première position, donc la meilleure solution est:

if ($counter != 0 && $counter % 3 == 0) {
   echo 'image file';
}

Vérifiez par vous-même. Je l'ai testé pour ajouter de la classe pour chaque 4ème élément.

0
Mohan