PHP: Как вы определяете каждую N-ю итерацию цикла? - PullRequest
52 голосов
/ 01 июня 2009

Я хотел выводить изображение каждые 3 сообщения через XML, вот мой код:

<?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.
}
?>

вот пример, первые 3 верны, но теперь он не зацикливается.

Ответы [ 8 ]

138 голосов
/ 01 июня 2009

Самый простой способ - использовать оператор деления на модули.

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

Как это работает: Модуль деления возвращает остаток. Остаток всегда равен 0, когда вы чётны.

Существует один улов: 0 % 3 равно 0. Это может привести к неожиданным результатам, если ваш счетчик начинается с 0.

10 голосов
/ 13 сентября 2013

Исходя из ответа @ Powerlord,

"Есть один улов: 0% 3 равно 0. Это может привести к неожиданные результаты, если ваш счетчик начинается с 0. "

Вы все еще можете начать свой счетчик с 0 (массивы, запросы), но сместить его

if (($counter + 1) % 3 == 0) {
  echo 'image file';
}
9 голосов
/ 01 июня 2009

Используйте арифметическую операцию по модулю, найденную здесь в руководстве по PHP.

, например

$x = 3;

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

Для более детального понимания вычислений модуля нажмите здесь .

5 голосов
/ 01 июня 2009

каждые 3 сообщения?

if($counter % 3 == 0){
    echo IMAGE;
}
2 голосов
/ 19 октября 2009

Я использую это обновление статуса, чтобы показывать символ «+» каждые 1000 итераций, и это, кажется, работает хорошо.

if ($ucounter % 1000 == 0) { echo '+'; }
2 голосов
/ 01 июня 2009

Как насчет: if (($ counter% $ display) == 0)

1 голос
/ 28 октября 2015

Вы также можете сделать это без модуля. Просто сбросьте счетчик, когда он совпадет.

if($counter == 2) { // matches every 3 iterations
   echo 'image-file';
   $counter = 0; 
}
0 голосов
/ 02 июня 2019

Это не будет работать для первой позиции, поэтому лучшее решение:

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

Проверьте это сами. Я проверил это для добавления класса для каждого 4-го элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...