PHPの勉強を始めて1ヶ月の初心者です。

PHPのwhile文とif文を使って以下のようなことをやりたいのですがうまくいきません。

1)while文の繰り返しの回数を4回に制限する。
2)配列の数が奇数の時「AA」と出力し、偶数の時「BB」と出力する。

間違いだらけだとは思いますが、一応作成したソースを記載します。

<?php

~中略~

$loop = 0;
$test = count($result);
while(($row = mysql_fetch_array($result)) && ($loop < 4)) {

if(($test % 2) != "0") {
echo "AA\n";
} else {
echo "BB\n";
}
}

mysql_close();
?>

回答の条件
  • 1人2回まで
  • 登録:2008/10/28 16:44:20
  • 終了:2008/10/28 19:19:20

ベストアンサー

id:Mook No.5

Mook回答回数1312ベストアンサー獲得回数3912008/10/28 19:12:47

ポイント20pt

>教えて頂いた二通りの方法試させて頂きました。両方とも表示回数は4回なのですが、

>「AA BB AA BB」とは表示されず「BB BB BB BB」と表示されてしまいます。


いや、それは提示されたソースと説明から類推した仕様なので。

まぁ、おかしな仕様だとは思いましたが。


AA、BBが交互に出るためには、表示部分を

    if ( ( $loop % 2 ) == 0 ) {
        echo "AA\n";
    } else {
        echo "BB\n";
    }

のように修正ください。


不明な点や補足はコメントでしますので、有効にお願いします。

id:finnapple

ありがとうございます。私の説明が悪かったようで申し訳ありませんでした。

無事交互に表示されました。

2008/10/28 19:18:48

その他の回答(5件)

id:GoldenDawn No.1

GoldenDawn回答回数426ベストアンサー獲得回数812008/10/28 17:45:23

ポイント20pt

1)while文の繰り返しの回数を4回に制限する。

while 中のブロックが一回実行される度に $loop がインクリメントされるべきですが、そのための記述が見当たりません。

while(($row = mysql_fetch_array($result)) && ($loop++ < 4)) {

などとするべきでしょう。


2)配列の数が奇数の時「AA」と出力し、偶数の時「BB」と出力する。

if 文まわりはこれで動くように見えます。実際の動作が期待とどの様に違うかが分かると解決に近づけるかもしれません。

ただ、

if(($test % 2) != "0") {

これだと数値と文字列を比較していることになります。PHP は型変換でうまく塩梅をつけてくれますが、

if (($test % 2) != 0) {

の方が素直でしょう。

id:finnapple

ご回答ありがとうございました。

以下のようにソースを修正しました。

$loop=0;

$test = count($result);

while(($row = mysql_fetch_array($result)) && ($loop++ < 4)) {

if (($test % 2) != 0) {

echo "AA\n";

} else {

echo "BB\n";

}

}

出力結果は「AA AA AA AA」となり表示回数の制限は無事クリアしましたが、「AA BB AA BB」とは出力されませんでした。

2008/10/28 18:19:03
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912008/10/28 17:45:49

ポイント20pt

やり方はいろいろありますし、ご自身で書かれた内容でほとんどできていると思いますが、

下記のような感じでどうでしょうか。

<?php

~中略~

$loop = 0;
$test = mysql_num_rows($result);
while(($row = mysql_fetch_array($result)) && ($loop < 4)) {
    if ( ( $test % 2 ) == 1 ) {
        echo "AA\n";
    } else {
        echo "BB\n";
    }
    $loop++; // 回数をインクリメント(増やす)
}

mysql_close();
?>

別の例として、while と if を使用していませんが、下記のような方法でもできると思います。

<?php

~中略~

$strData = ( ( mysql_num_rows($result) % 2 ) == 1 ) ? "AA\n" : "BB\n";
for( $i=0 ; $i<4 ; $i++ ){
    if( ($row = mysql_fetch_array($result) ) == FALSE )
        break; 
    echo $strData;
}

mysql_close();
?>
id:finnapple

ご回答ありがとうございます。

教えて頂いた二通りの方法試させて頂きました。両方とも表示回数は4回なのですが、

「AA BB AA BB」とは表示されず「BB BB BB BB」と表示されてしまいます。

2008/10/28 18:30:29
id:pahoo No.3

pahoo回答回数5960ベストアンサー獲得回数6332008/10/28 17:50:11

ポイント20pt

ご質問の要件で分からないことがあります。

  • なぜソースにMySQLが登場するのか。
  • 「配列の数が奇数の時」と言っているが、$resultの意味が分からないと、whileループを複数回回す意味が分からない。

で、「配列の数」を「添え字の値」と置き換えた場合は、以下のようなソースになります。

たぶん質問の主旨に合っていないと思うので、上記の点を具体的にお知らせください。

$count = 0;
while ($count < 4) {
    if ($count % 2 == 0)    echo "BB\n";
    else                    echo "AA\n";
    $count++;
}
id:finnapple

すみません、説明不足でした。回答になっているかわかりませんが、実際は以下のようにmysqlに接続してテーブルを参照します。

$db = mysql_connect("localhost","test","test");

if(! $db) {

die ("データベースに接続できません。");

}

$db_selected = mysql_select_db('DB名');

if(! $db_selected) {

die ('データベース選択失敗です。'.mysql_error());

}

mysql_query("set names utf8", $db);

$result = mysql_query("select * from テーブル名",$db);

if(! $result) {

die ('クエリーが失敗しました。'.mysql_error());

}

$loop = 0;

$test = count($result);

while(($row = mysql_fetch_array($result)) && ($loop < 4)) {

if(($test % 2) != "0") {

echo "AA\n";

} else {

echo "BB\n";

}

echo $row['id']; //テーブルの項目から値を持ってくる。

}

mysql_close();

?>

2008/10/28 18:35:45
id:goodvn No.4

goodvn回答回数228ベストアンサー獲得回数182008/10/28 17:56:51

ポイント20pt

こういうループは,while ではなく,for を使うのが一般的です.もし,学校の課題などで,while を使うと限定されていたら,for は使えませんが.


for ($i = 0; $i < 4; $i++) {

}

これは,そのまま while に書き換えが可能で,

$i = 0;

while ($i < 4) {

$i++;

}

となります.

SQLの結果も同時に条件とすることができ,

for ($i = 0; $i < 4 && $row = mysql_fetch_array($result); $i++) {

}

となります.

id:finnapple

説明不足ですみません。

実は実際作成しているものは以下のように途中で条件の違うif文を使ったりしていますのでfor文ではできないかと思いwhile文を使いました。

while(($row = mysql_fetch_array($result)) && ($loop++ < 4)) {

if (($test % 2) != 0) {

echo "AA\n";

} else {

echo "BB\n";

}

if (($test % 2) != 0) {

echo "AA\n";

} else {

echo "BB\n";

}

if($row['test'] != 1) {

echo "aaa";

} else if($row['test'] != 2) {

echo "bbb";

} else {

echo "ccc";

}

}

上記のような例でもfor文でいけたりしますか?

2008/10/28 18:42:53
id:Mook No.5

Mook回答回数1312ベストアンサー獲得回数3912008/10/28 19:12:47ここでベストアンサー

ポイント20pt

>教えて頂いた二通りの方法試させて頂きました。両方とも表示回数は4回なのですが、

>「AA BB AA BB」とは表示されず「BB BB BB BB」と表示されてしまいます。


いや、それは提示されたソースと説明から類推した仕様なので。

まぁ、おかしな仕様だとは思いましたが。


AA、BBが交互に出るためには、表示部分を

    if ( ( $loop % 2 ) == 0 ) {
        echo "AA\n";
    } else {
        echo "BB\n";
    }

のように修正ください。


不明な点や補足はコメントでしますので、有効にお願いします。

id:finnapple

ありがとうございます。私の説明が悪かったようで申し訳ありませんでした。

無事交互に表示されました。

2008/10/28 19:18:48
id:pahoo No.6

pahoo回答回数5960ベストアンサー獲得回数6332008/10/28 19:15:59

ポイント10pt

#3のコメントで全貌が分かりました。ありがとうございます。

では、こんな感じではどうでしょう。

$loop = 0;
$test = count($result);
while (($row = mysql_fetch_array($result)) && ($loop < 4)) {
    if (($test % 2) != "0")  echo "AA\n";
    else                     echo "BB\n";
    echo $row['id'];    //テーブルの項目から値を持ってくる。
    $loop++;
}

終了条件が複数あるので、お考えの通り、for 文より while 文の方が見やすいと思います。


※設定された回答回数の上限になりました。さらにフォローが必要でしたら、コメント欄を開けていただくか、回答回数を増やしてください。

  • id:Mook
    pahoo さんの回答は、交互に表示する内容になってますね。

    誤解を招いたのは、「配列の数」です。これが、
    (1)配列の要素数なのか
    (2)配列のデータの中の数なのか
    (3)配列のインデックスの数なのか
    がわからなかったので(3)かなとも思ったのですが、例示されたソースが(1)を参照する
    形だったのでそのようにしました。

    まぁ結局(3)がご希望の形だったようですが。
    このようなときは、期待される表示結果を提示されると誤解が少なくなると思います。

  • id:finnapple
    今後質問する時は誤解の内容に気をつけます。

    ちなみに(1)と(2)の違いは何となく分かるのですが、(1)と(3)の違いというのは何でしょうか?
    また、参照の方法が変わるのでしょうか?

    私なりの解釈ですが、
    (1)はテーブルに登録した行(レコード?)の数、下記は2行なので数は2。

    | ID(インデックス) | age |
    |-----------------|-----------------|
    | 1 | 24 |
    |-----------------|-----------------|
    | 2 | 50 |
    |-----------------|-----------------|


    (2)はフィールドの値、フィールド:ageを参照する場合は24と50
    | ID(インデックス) | age |
    |-----------------|-----------------|
    | 1 | 24 |
    |-----------------|-----------------|
    | 2 | 50 |
    |-----------------|-----------------|


    (3)はレコードを検索する通し番号の数?数で言うと(1)と同じなので2
    | ID(インデックス) | age |
    |-----------------|-----------------|
    | 1 | 24 |
    |-----------------|-----------------|
    | 2 | 50 |
    |-----------------|-----------------|
  • id:finnapple
    すみません表示がずれてしまいましたので、以下をご確認下さい。
    http://www.geocities.jp/qntbd042/demo/demo.html
  • id:Mook
    (1) は要素数なのでどこにおいてもいつでも2(今回の例では)のままです。
    (2) は(ループ内の)処理のそれぞれにおけるデータを指すので、24,50,・・・ と変化していきます。
    (3) は(ループ内の)処理のそれぞれにおけるインデックスを指すので、1,2,・・・ と変化していきます。
    ということで、意味が通じるでしょうか。
  • id:finnapple
    説明ありがとうございました。
    (1)、(2)は自分の理解どおりで安心しました。
    (3)に関してはまだよくわからない部分がありますが、自分の知識不足なので勉強します、ありがとうございました。
  • id:Mook
    連想配列はまた別ですが、通常 $arrayName[$n] のような形で $n が整数であるとき、
    $n を配列のインデックスと呼びます。

    for( $i=0 ; $i<10 ; $i++ ){
    print "インデックス=".$i."、データ=".$arrayName[$i];
    }
    といった感じです。

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

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

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

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