Make money!
サイト管理者をやっていると「ランダムに広告を表示したい」というときがあると思います。いろいろ方法がありますが、今回はPHPを使った方法を紹介。
自分なりに「広告を表示するためのリストファイルを1つだけ用意して、そこからいくつかの広告を選んでランダム表示」というのを考えてみました。
よくある方法(直書き)
まずはよくある方法。「PHP ランダム 広告」で検索するとよく見る方法がこれですね。
<?php $rndtxt[0] = 'テキスト1'; $rndtxt[1] = 'テキスト2'; $rndtxt[2] = 'テキスト3'; $rndtxt[3] = 'テキスト4'; $rndtxt[4] = 'テキスト5'; $length = count($rndtxt) - 1; srand( (double)microtime()*1000000 ); $num=round( rand(0,$length) ); print("$rndtxt[$num]"); ?>
判りやすくていいのですが、
- メンテナンスが困難
- 複数のページで使いづらい
- コードが長くなりがち
という点が気になります。
少し工夫した方法(外部ファイルを利用)
外部ファイルを利用すると、少しメンテナンスが楽になります。
<?php srand((double)microtime()*1000000); $ad_list1 = file("/home/php/public_html/ad.txt"); $ad_key1 = array_rand($ad_list1, 2); $ad1 = $ad_list1[$ad_key1[0]]; // 表示 echo $ad1; ?>
この方法では
- 外部ファイルからデータを読み込む
- 行をランダムに並べ替え
- 並べ替えた最初の行を書き出す
という方法のようです。
こんなときどうする?
上記の方法でなんの問題もない場合の方が多いと思うのですが、たとえば、広告リストに
- まじめな広告1
- まじめな広告2
- まじめな広告3
- あやしい広告1
- あやしい広告2
- あやしい広告3
という広告表示用のコードを書いて、「トップページでは1~3を表示して、あるページでは4~6を表示、別のあるページでは1~6を表示」といったことはできません。
このように細かく表示を変更したい場合は、複数の広告リストを用意する必要があります。マンドクサイ!!
自分が考えた方法(任意の行を抜き出す)
ということで考え出したのが、こんなスクリプト。
<?php
srand((double)microtime()*1000000);
$ad_list = file('/path/to/ad-list.txt');
$ad_num = array(1,2,4);
$rand_key = array_rand($ad_num, 1);
$ad = $ad_list[$rand_key--];
echo $ad;
?>
$ad_num
が工夫したポイントです。
$ad_list
に広告リスト“ad-list.txt”の内容を代入$ad_num
に「表示したい広告の行数」を代入$ad_num
から「1,2,4」行の中からランダムに行数を抜き出し- 広告(
$ad
)を出力
という感じ。
`$ad_list[$rand_key–]`で`$rand_key`から1を引いているのは、PHPの配列が「0」から始まるのに対して、一般的なエディタの行数が「1」から始まるので、合わせてみました。
上記の例でいうと“ad-list.txt”というファイルを用意して、一行に一つの広告表示用のコードを書いて、上記のPHPスクリプトで読み込んでください。
この記事のタグ(偽)
[タイトルは二進数][「I はぁと PHP」な人の添削を希望]
コメント
「Project MultiBurst」の管理人をしております、showBOOです。
引用していただき、光栄に存じます。
たしかにご指摘の通り、当方のやり方では管理が非常にめんどくさいです。
公開はしておりませんが、WEB上でのCSVエディタを利用して、広告表示と管理を行い、それをPHPコードで吐き出す、というツールを使っています。
で、現在、そのツールの公開を目指して開発中でございます(^^;)
亜細亜ノ蛾さんの提案しておられる、場所によっては違う広告を表示する、や、各広告にプライオリティー(出現頻度)をつける、といったものも盛り込もうかと考えております。
(本人キター!!)こちらこそ、お目汚しな記事に目を通して頂いて、光栄です。きっと、「CSSってとかそーゆーのだよね」みたいにおかしなことが書いてあると思います。
新しいツール、期待して待ってます!
こちらの記事のスクリプトを試させていただいたのですが、
「1,2,4行目の中からひとつ」ではなく「1~3行目の中からひとつ」
表示されてしまうようです。
$ad_numで指定した行数(1,2,4)ではなく、$ad_numに書かれている
数字の個数(3)の中から選ばれるようになっているように思うのですが、
いかがでしょうか。
※もし当方の間違いのようであれば申し訳ありません
こんにちは!PHPでランダム表示させるスクリプトを探していて、ここにたどり着きました。
とても参考になりました!ありがとうございます。
また、表示させる広告を一つだけではなく複数表示させたいと思っているのですが、どうすればよいでしょうか?
たとえば、
ad-list.txt に
テキスト1
テキスト2
テキスト3
と書いて、
表示ページには、
テキスト2 テキスト1 テキスト3
のように表示させたいと考えています。
お手数ですが、お力添え頂ければと思います。
つよしおか さん、どうもです。質問の件なら、下記のように単純なコードで実現できます。
<?
$ad_list = file(‘/path/to/ad_list.txt’);
$ad_num = array(2,1,3);
foreach($ad_num as $val) {
echo $ad_list[–$val] . ‘<br>’;
}
?>
しかし──、本文のコードも上記のコードも、「美しくない」です。それが分かるくらいには、PHP も慣れてきたのですが……。
いつか、ちゃんとしたキレイなコードで、この記事を書き直しますね。
お忙しい中、早速のご返信ありがとうございます!
すみません、説明不足でした。
アクセスするたびに、
テキスト2 テキスト1 テキスト3
or
テキスト3 テキスト2 テキスト1
or
テキスト3 テキスト1 テキスト2
or
テキスト1 テキスト2 テキスト3
のように、ランダムで並び順が変わるように
したいと思っています。
お手数をおかけいたしまして、
大変申し訳御座いませんが、ご返信頂ければと思います。
それでは宜しくお願いいたします。
遅くなりましたが、こんな感じで どうですか?
// 広告リストの場所
$ad_list = file(‘/path/to/ad_list.txt’);
// 何行目を使う?
$ad_array = array(2,4,6,8);
srand ((float) microtime() * 10000000);
$ad_num = count($ad_array);
$rand_keys = array_rand ($ad_array, $ad_num);
for($i=0; $i<$ad_num; $i++){
print $ad_list[–$ad_array[$rand_keys[$i]]] . ‘<br>’;
}
この例だと、2,4,6,8 行目をランダムに並べ替えて表示されます。
できました!!
ありがとうございます!