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

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();
?>

●質問者: 雨の日
●カテゴリ:ウェブ制作 学習・教育
✍キーワード:AA BB ECHO LOOP PHP
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● GoldenDawn
●20ポイント

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) {

の方が素直でしょう。

◎質問者からの返答

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

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

$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」とは出力されませんでした。


2 ● Mook
●20ポイント

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

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

<?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();
?>
◎質問者からの返答

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

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

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


3 ● pahoo
●20ポイント

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


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

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

$count = 0;
while ($count < 4) {
 if ($count % 2 == 0) echo "BB\n";
 else echo "AA\n";
 $count++;
}
◎質問者からの返答

すみません、説明不足でした。回答になっているかわかりませんが、実際は以下のように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();

?>


4 ● goodvn
●20ポイント

こういうループは,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++) {

}

となります.

◎質問者からの返答

説明不足ですみません。

実は実際作成しているものは以下のように途中で条件の違う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文でいけたりしますか?


5 ● Mook
●20ポイント ベストアンサー

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

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


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

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


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

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

のように修正ください。


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

◎質問者からの返答

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

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


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


●質問をもっと探す●



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