- ベストアンサー
while文についての質問
- while文についての質問です。while文は重複値をチェックして値が同じであれば繰り返し処理を行うものであり、SISID重複チェックに使用されています。しかし、実装に自信がなく質問をいただきました。
- 質問のコードを見ると、SISID生成とSISID重複チェックのメソッドが定義されています。SISID生成メソッドではセッションIDを返し、SISID重複チェックでは生成されたSISIDとDBから取得した値を比較して重複をチェックしています。
- 重複チェックが行われている部分でwhile文が使われています。while文の中では、DBから取得した値と生成されたSISIDを比較し、重複があれば再度SISIDを生成してチェックを繰り返します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> while ($key = array_search($this->key, $tmp)) { > if ($key !== false) { > $this->key = sha1(uniqid(mt_rand() , true)); > } else { > break; > } whileはtrueの時のみループを実行しますので、 $tmpの中に該当する値が存在しなかった場合、ループ中の処理は行われません。 whileの中のifはなくても大丈夫ですよ。
その他の回答 (1)
- mizutaki
- ベストアンサー率33% (111/333)
まずはじめに、 DBの負荷は関係ないですよ。 DBの負荷というものは、DBへのアクセス回数とか、SQLの内容や、DBに入っているデータの個数が関係してきますから while(list($val) = $tmp) これが違う。 1回目のループも2回目のループも$valには一番目の値しか入ってきませんので、即無限ループ そういう場合echoで取得してたり、foreachに頼るべき場所なんですが、 sisidがかぶっていた場合、また最初からループをやり直すということなので、 これは少し厳しい。 配列が一般的な配列なのであるのでしたら、 countで配列の中身の個数を取得して、forでループをする。 forのループの途中で被ってる値が見つかったら、forの現在位置をリセットしてあげれば、 やりたいことが出来ますよ。 ちなみにPHPの関数の中にはarray_searchという非常に便利な関数も存在しているので、 こちらを使ったほうが簡単かもしれないです
補足
お返事ありがとうございます。やはり聞いてよかったです^^; というか冷静に考えると都度変更する値なのでセッションidを利用する理由も特になかったので 任意の乱数を用いる事にしました。 実行するには以下のような感じでしょうか?(抜粋) // DBで取得した値の配列 $tmp = array('値1', '値2', '値3'); // 乱数生成 $this->key = sha1(uniqid(mt_rand() , true)); while ($key = array_search($this->key, $tmp)) { if ($key !== false) { $this->key = sha1(uniqid(mt_rand() , true)); } else { break; }
お礼
お返事ありがとうございます。 >whileはtrueの時のみループを実行しますので foreachやforはよく使うのですがwhileは使用する癖が全くなかったもので初めて知りました^^; おかげ様で無事に解決です。ありがとうございました^^