0

バナーローテーターで少し違うことをしようとしています。

以下は、2 つのテキスト ファイル (ルート ディレクトリに .db 拡張子で保存されている) を読み取って Web サイトのバナーをローテーションするために使用しているスクリプトです。1 つのファイルにはカウンター (FileDB) が含まれ、もう 1 つのファイルには HTML バナー コード (URLDB) が含まれます。

URLDB ファイルには現在、ハイパーリンク バナーを表示するための 6 行の 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];
}

?>

バナーを表示したい Web ページには、8 つのプレースホルダーがあります。ただし、バナーは 6 つしかありません。

各プレースホルダーの 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];?>

カウントが 0 の場合、プレースホルダー 1 ~ 6 に 6 つのバナーが表示され、プレースホルダー 7 と 8 は空白になります。

更新のたびにカウンターが 1 ずつ増え、最初に配置されたホルダーに各バナーが表示され、5 から 0 まで各プレースホルダーを介して他のバナーが表示されますが、6 番目のバナーがプレースホルダー 1 に配置されるまで、以前に入力されたプレースホルダーは空白のままになります。次に更新すると、バナー 1 ~ 6 が再び表示されます。

これは、各プレースホルダーの値をハードコーディングしており、上記のスクリプトによって構築された配列の範囲外にあるファイル内のエントリを参照しようとしているために発生します。

ここで実例を見ることができます。

私が達成しようとしているのは、最後のエントリが表示されたときに、最初のエントリが次のプレースホルダー (この場合はプレースホルダー 7) に表示され、2 番目のエントリがプレースホルダー 8 に表示されるように、URLDB のすべてのバナーを表示することです。 .

アイデアは、各ページが更新され、カウンターがインクリメントされるたびに、電車の車両のようにバナーが各プレースホルダーを連続的に移動するというものです。

さて、私の質問の背景がわかりました。

スクリプトを修正して、URLDB ファイル/配列のエントリの最大数を PHP 変数に格納し、その後、プレースホルダーに条件付き処理を追加して、カウンターがこの最大値に達したときを確認し、次の有効な値を参照する方法はありますか?余剰のプレースホルダーでバナーが再び再開するように、配列 (つまり 0) で - ここでは空白または空のプレースホルダーが表示されていませんか?

これは奇妙な要求のように思えるかもしれません。もちろん、現在の状況に基づいて目標を達成する方法についてアドバイスをいただければ幸いです。

4

1 に答える 1

0

ループを使用すると、操作が少し簡単になります。うまくいけば、次の方法で問題が解決します。

$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];
}

モジュラス演算子の詳細については、こちらを参照してください

于 2013-08-17T23:34:41.800 に答える