Условная обработка PHP необходима для непрерывного отображения вращающихся баннеров

Я пытаюсь сделать что-то немного другое с ротатором баннеров.

Ниже приведен сценарий, который я использую для чтения двух текстовых файлов (хранящихся в моем корневом каталоге с расширениями .db) для чередования баннеров на веб-сайте. Один файл содержит счетчик (FileDB), другой содержит код HTML-баннера (URLDB).

В настоящее время файл URLDB содержит шесть строк HTML-кода для отображения баннеров с гиперссылками.

Следующий скрипт строит массив и последовательно чередует эти баннеры при обновлении страницы, считая от 0 до 5, и делает это отлично:

<?php
define('FILEDB', '/WORKING DIRECTORY/count.db');
define('URLDB', '/WORKING DIRECTORY/url.db');

function readURLS()
{
  $fo = fopen(URLDB, 'r');

  if( null == $fo )
    return false;

  $retval = array();
  while (($line = fgets($fo)) !== false)
  {
    $retval[] = $line;
  }

  return $retval;
}

$list = readURLS();

if( false === $list )
{
  echo "No URLs available";
}
else
{
  $fo = fopen(FILEDB, 'a+');

  $count = (fread($fo, filesize(FILEDB)) + 1) % count($list);

  ftruncate($fo, 0);
  fwrite($fo, "{$count}");
  fclose($fo);

  echo $list[$count];
}

?>

На веб-странице, на которой я хочу отображать баннеры, есть восемь заполнителей. Однако у меня есть только шесть баннеров.

Вот код PHP в каждом из заполнителей:

Placeholder 1: <?php echo $list[$count];?>
Placeholder 2: <?php echo $list[$count +1];?>
Placeholder 3: <?php echo $list[$count +2];?>
Placeholder 4: <?php echo $list[$count +3];?>
Placeholder 5: <?php echo $list[$count +4];?>
Placeholder 6: <?php echo $list[$count +5];?>
Placeholder 7: <?php echo $list[$count +6];?>
Placeholder 8: <?php echo $list[$count +7];?>

При нулевом счете 6 баннеров отображаются в заполнителях 1–6, а заполнители 7 и 8 пусты.

При каждом обновлении счетчик увеличивается на единицу, показывая каждый баннер в первом размещенном держателе и перемещая другие баннеры через каждый заполнитель от 5 до 0, но оставляя ранее заполненные заполнители пустыми, пока шестой баннер не окажется в заполнителе один. Затем при следующем обновлении баннеры с 1 по 6 снова отображаются.

Это происходит из-за того, что я жестко запрограммировал значения в каждом заполнителе и, очевидно, пытаюсь сослаться на запись в файле, которая находится за пределами массива, созданного приведенным выше сценарием.

Вы можете увидеть рабочий пример здесь.

Чего я пытаюсь добиться, так это отобразить все баннеры в базе данных URL таким образом, чтобы при отображении последней записи первая запись отображалась в следующем заполнителе (в данном случае это заполнитель 7), а вторая запись отображалась в заполнителе 8. .

Идея состоит в том, что баннеры непрерывно перемещаются через каждый из заполнителей, как вагоны поезда, с каждым обновлением страницы и увеличением счетчика — один следует за другим.

Итак, теперь у вас есть предыстория моего вопроса.

Есть ли способ изменить сценарий, чтобы сохранить в переменной PHP максимальное количество записей в файле/массиве URLDB, а затем добавить условную обработку в заполнители, чтобы проверить, когда счетчик достигает этого максимального значения, и ссылаться на следующее допустимое значение в массиве (т.е. 0), так что баннеры снова перезапускаются в избыточных заполнителях - так здесь не отображаются пустые или пустые заполнители?

Думаю, это может показаться странной просьбой. Но, конечно, я был бы признателен за любые советы о том, как достичь моей цели, основываясь на том, как обстоят дела в настоящее время.


person user2692412    schedule 17.08.2013    source источник
comment
Я вижу, это ваш первый пост; добро пожаловать в СО! Есть несколько вещей, которые вы должны знать. Во-первых, я не читал ваш вопрос, но, просто просмотрев его, кажется, что может быть немного больше организации и изоляции проблемы. Лучше всего объяснять проблему в самом широком смысле. Например, вместо того, чтобы говорить что-то вроде «Почему моя переменная $blah не копируется в следующий 100-строчный скрипт», выясните, в чем реальная проблема, и спросите, почему не копируется blah при использовании переменной переменной? Надеюсь, это имело смысл. Другими словами, люди больше реагируют на более широкие (но достаточно конкретные) вопросы.   -  person jeremy    schedule 18.08.2013
comment
Привет, Джереми, спасибо. Я думал, что изолировал проблему в своем вопросе, т.е. попытался дать представление о том, что я сделал и пытаюсь достичь (это трудно описать только в заголовке).   -  person user2692412    schedule 18.08.2013


Ответы (1)


Как только вы используете цикл, становится немного легче манипулировать. Надеемся, что следующее решит вашу проблему.

$numOfBanners    = count($list);
$numOfPlacements = 8;
for ($i=0; $i < $numOfPlacements; $i++) {
  // use the modulus operator to come back around
  $bannerID = $i % $numOfBanners; 
  echo $list[$bannerID];
}

Дополнительную информацию об операторе модуля можно найти здесь.

person rc_luke    schedule 17.08.2013
comment
Привет, rc_luke, спасибо за код и направление к оператору модуля, я пойду и прочитаю это. - person user2692412; 18.08.2013
comment
Привет, rc_luke, приведенный выше код не делал того, что мне было нужно, однако мне удалось решить, как это сделать с помощью простой математики и условия ЕСЛИ. Большое спасибо, что откликнулись. - person user2692412; 19.08.2013