PHPの質問です 以下の配列を0から順番に一つづつ表示し、$a[2]まで表示したらまた$a[0]にループして表示してくれるプログラムを教えてください

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/04/19 11:38:41
  • 終了:2013/04/26 11:40:05

回答(6件)

id:dawakaki No.1

だわかき回答回数797ベストアンサー獲得回数1222013/04/19 12:20:20

ポイント40pt

$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";
    }
}
?>
id:takanii

あ、違います
1回目実行した時→おはよう の文字だけ表示
2回目実行した時→こんにちは の文字だけ表示
3回目実行した時→こんばんわ の文字だけ表示
4回目実行した時→おはよう の文字だけ表示
いかループ

という感じで動作してくれるプログラムがほしいのです

2013/04/19 12:23:43
id:Cherenkov No.2

Cherenkov回答回数1502ベストアンサー獲得回数4922013/04/19 19:26:27

ポイント40pt

うーん

<?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];
id:kakero No.3

ノックバックⅢ回答回数13ベストアンサー獲得回数02013/04/20 16:02:07


$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
・・・

id:taknt

Add Starまで コピペしてるwww

2013/04/22 20:10:54
id:tezcello No.4

tezcello回答回数460ベストアンサー獲得回数692013/04/22 01:20:08

ポイント40pt

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

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

id:dawakaki No.5

だわかき回答回数797ベストアンサー獲得回数1222013/04/23 15:49:44

ポイント40pt

アクセスする度に$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);
?>
id:boost_beast No.6

boost_beast回答回数785ベストアンサー獲得回数312013/04/26 09:07:41

ポイント40pt

http://www.php-labo.net/tutorial/php/loop.html

こちらが参考になると思います。

  • id:tezcello
    > あ、違います
    > 1回目実行した時
    そういう事は最初に書いておかないと全く違ったものになってしまいます。

    更に、「2回目の実行」が『誰がリクエストしたか』を考慮したものであるのかどうかも。
    誰でもいいから2回目なのか、同一の人(あるいはブラウザ)からの2回目のリクエストなのかって事です。


    それにしても、質問サイトだと思っていたのだけれど、「くれくれ」サイトになってしまったのか...

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません