人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPの質問です 以下の配列を0から順番に一つづつ表示し、$a[2]まで表示したらまた$a[0]にループして表示してくれるプログラムを教えてください
$a[0] = "おはよう";
$a[1] = "こんにちは";
$a[2] = "こんばんわ";


●質問者: takanii
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● だわかき
●40ポイント

$a[0]?$a[2]を$m回繰り返して表示するプログラムです。

<?php
$a[0] = "おはよう";
$a[1] = "こんにちは";
$a[2] = "こんばんわ";
$m = 10; //繰り返す回数

$n = count($a);
for ($j = 0; $j < $m; $j++) {
 for ($i = 0; $i < $n; $i++) {
 echo $a[$i];
 echo "<br />\n";
 }
}
?>

takaniiさんのコメント
あ、違います 1回目実行した時→おはよう の文字だけ表示 2回目実行した時→こんにちは の文字だけ表示 3回目実行した時→こんばんわ の文字だけ表示 4回目実行した時→おはよう の文字だけ表示 いかループ という感じで動作してくれるプログラムがほしいのです

2 ● Cherenkov
●40ポイント

うーん

<?php
$a[0] = 'おはよう';
$a[1] = 'こんにちは';
$a[2] = 'こんばんわ';

$cookiename = 'hateq';
$expires = time() + 10;
$counter;
$val = 0;

if (isset($_COOKIE[$cookiename])) {
 $val = $_COOKIE[$cookiename];
 $counter = $val;
 if ($counter >= count($a) - 1) {
 $counter = 0;
 } else {
 $counter++;
 }
} else {
 $counter = 1;
}
setcookie($cookiename, $counter, $expires);
echo $a[$val];

3 ● ノックバック?
●0ポイント


$a[0] = 'おはよう';
$a[1] = 'こんにちは';
$a[2] = 'こんばんわ';

$cookiename = 'hateq';
$expires = time() + 10;
$counter;
$val = 0;

if (isset($_COOKIE[$cookiename])) {
$val = $_COOKIE[$cookiename];
$counter = $val;
if ($counter >= count($a) - 1) {
$counter = 0;
} else {
$counter++;
}
} else {
$counter = 1;
}
setcookie($cookiename, $counter, $expires);
echo $a[$val];

Add Star
id:kakero
・・・


きゃづみぃさんのコメント
Add Starまで コピペしてるwww

4 ● tezcello
●40ポイント

今回のように繰り返す場合、単純に回数を数えて、その剰余で状態を変えるのが王道だと思うけど?

$cnt = ...
$msg = array(
 'おはよう',
 'こんにちは',
 'こんばんは', // 「こんばんわ」は間違いだと思う
);
print $msg[$cnt++ % 3]; // $msg[$cnt++ % count($msg)] でも可

整数のオーバーフローを考慮しなければいけない状況なら、剰余を元の変数に戻せばいいだけだし...
__http://php.net/manual/ja/language.types.integer.php#language.types.integer.overflow

アクセスしてきた人を特定せず、単純に「最初のアクセスは...2回目のアクセスは...」というようにやるなら、ローカルにアクセス回数を記録するファイルを作って、その値で表示する文字列を変更するという手で出来ます。

$filename = 'count.txt';
$msg = array(
 'おはよう',
 'こんにちは',
 'こんばんは',
);

$fp = fopen($filename, 'c+b');// PHP5.2.6 以降
flock($fp, LOCK_EX);
$cnt = (int)fgets($fp);
print $msg[$cnt % 3];
$cnt += 1;
fseek($fp, 0);
ftruncate($fp, 0);
fwrite($fp, $cnt);
fflush($fp);
flock($fp, LOCK_UN);// PHP 5.3.2 以降はアンロックを自力でやる必要がある
fclose($fp);

マニュアルにはロックに失敗した場合の処理があるが、基本的にロックは失敗しないんじゃないかなぁ?
失敗するとしたら、オープンできなかった場合だと...

特定の人(というよりもブラウザ)からのアクセスを見分けて、その人の「最初の...」であるなら、アクセス元を区別する為に Cookie を使ってアクセス元に「○回目のアクセス」を記憶しておいてもらうのが普通でしょう。
ただし、Cookie が使えない端末(使わない設定にしてあるを含む)もあり、その場合は毎回初めてとして処理されます。
__これは他の回答者さんと同じ
__No.3 さんは投稿ミス?それとも悪質回答者?

$msg = array(
 'おはよう',
 'こんにちは',
 'こんばんは',
);
$cookiename = 'takaniiCount';
$available = 5; // 有効な時間(秒単位)
 // この時間内の再アクセスの場合に「次の文字列」に変わる

$cnt = isset($_COOKIE[$cookiename]) ? ($_COOKIE[$cookiename]) : 0;
print $msg[$cnt++ % 3];

setcookie($cookiename, $cnt, time()+$available);

有効時間を短く設定すると、その短い時間内での再アクセスじゃないと次の文字列に切り替わりません。つまり、チョッと間をおいてしまうと最初に戻ってしまう。
長めにすると、久しぶりのアクセスでも忘れずに「次の文字列」へ切り替えてくれます。
どんな用途を想定しているのかは質問文からは解りませんので、どんな設定(数秒、数分、数時間、24時間、一週間、一ヶ月...)にするかはお考えください。


Cookie にアクセス時間も入れるようにしておけば、短時間での再アクセスは同じ文字列を表示し、ある程度時間が経過してからの再アクセスの場合に次の文字列を表示するという事も可能です。


5 ● だわかき
●40ポイント

アクセスする度に$a[0]?$a[2]を繰り返して表示するプログラムです。

<?php
$fname = 'counter.txt';
$a[0] = "おはよう";
$a[1] = "こんにちは";
$a[2] = "こんばんわ";

$n = count($a);
$fp = fopen($filename, 'w+');
$i = fgets($fp);
if ($i == '' || $i >= $n) $i = 0;

echo $a[$i];
echo "<br />\n";

$i++;
fwrite($fp, $i);
fclose($fp);
?>

1-5件表示/6件
4.前の5件|次5件6.
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ