質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2987閲覧

while内の変数をwhile外に引継ぎできない

12_345678_90

総合スコア14

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/08/15 09:30

phpで、whileを使っているときに、わからなくなったことです。

php

1<?php 2$a="0"; 3while($a > 6){ 4$a=md_rand(1,10); 5} 6echo $a; 7?>

上記のソースでは、

1.$aは0

2.1~10の中で、ランダムな値をで$aに入れる

3.whileで$aが6以下($aが7,8,9,10以外のとき)だと、
6以上になるまで2.を繰り返す。

4.$aの値を表示する(7,8,9,10のどれか)

と動くと思っていましたが、
結果は0になりました。

while内で初期化した変数は、while外では、引継ぎできないのかなと思いました。
解決策を調べるために、ネットで調べてみても解決できませんでした。

どうすれば、理想と同じように動きますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

もしかして:

<?php $a = 0; do { $a = mt_rand(1, 10); } while($a > 6); echo $a;

投稿2018/08/15 09:56

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

12_345678_90

2018/08/15 10:01

回答ありがとうございます。 doを使うという手段を完全に忘れていました。 ありがとうございました
guest

0

ベストアンサー

そもそもwhileの中、1回も通ってませんよ。
下記のようにしてデバッグしてみてください。

php

1<?php 2$a="0"; 3while($a > 6){ 4 $a=md_rand(1,10); 5 echo $a."<br />"; 6} 7echo $a;

出力結果:0 

なぜなら「$aが6より大きい間、ループ」だからです。
初期値0なので6より小さいため、1度もwhile内は実行されません。

$a < 6にすれば「$aが6より小さい間、ループ」となるため通りますが、そもそもmd_rand()という関数はデフォルトのPHPには存在しないため、関数未定義のエラーが出ます。
mt_rand()ですね。

投稿2018/08/15 09:40

編集2018/08/15 09:41
m.ts10806

総合スコア80854

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

12_345678_90

2018/08/15 09:47 編集

ありがとうございます。 mb~~という関数がphpにあるので間違えてしまいました。(bとdは、似てるから間違えただけ。) 先にwhile内の処理を行うかと思っていましたが、違うんですね。 勘違いをしていました。
退会済みユーザー

退会済みユーザー

2018/08/15 09:58

文字列で "0" を代入しているのも、気になる気になる~。 暗黙の型変換に頼ると、思わぬところで足元を救われますぞ。
m.ts10806

2018/08/15 09:58

m"t"なのでbでもdでもありません。いずれにしてもPHPマニュアルを確認する癖をつけて間違いなく関数を利用してください。 回答をどこまで理解されたかわかりませんが、whileのループに入る条件を初期値に設定していないためwhile内が1回も実行されていません。
m.ts10806

2018/08/15 10:00

m6uさん あえて指摘しませんでしたが、その通りですよね。 「数値」を扱うならクォーテーションで囲わないのがあるべき姿です。
12_345678_90

2018/08/15 10:05

いつもクォーテーションでかこっているので、こうしないとエラーが出てしまうのかなと、勝手に思っていました。 数値と文字列は、phpでは囲うか囲わないかで区別されるんですね。知りませんでした。
m.ts10806

2018/08/15 10:25

いえ、基本は区別されません。 もう少し「型」というものを意識していただきたいところではあります。 最新のものでもあまり型は意識せずにコーディングできますが、型を意識したコーディングが推奨されます。 変数宣言時の型、引数の型などなど。 型宣言のページを確認してください。 http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration デフォルトでは型が区別することはありませんが、 下記のような例で違いが出てきます。 $a="0"; if($a == 0) echo "==true"; if($a === 0) echo "===true"; 上のifは==trueと出力されますが、下のifでは何も出力されません。 本来は違った型であっても「暗黙の型変換」というのが行われています。 何も型を意識していないコーディングだといろいろと問題がでることがありますし、「設計」が意味を成さなくなることもあります。 下記のような記事も参考にしてみてください。 https://qiita.com/shinkuFencer/items/48718f0c8d203ca513db
12_345678_90

2018/08/15 10:49

詳しい解説ありがとうございます。 まだまだ勉強しておかないといけないなと思いました。
m.ts10806

2018/08/15 10:51

何事も動かしてみることです。私の回答にあるようなデバッグ出力する癖をつけると問題解決も早くなりますし機能に対する理解も進みます。
12_345678_90

2018/08/15 10:55

わかりました。次からデバック出力をして、できれば自己解決できるようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問