dポイントプレゼントキャンペーン実施中!

while文について教えてください。
重複値をチェックして値が同じであれば繰り返し処理をするいうものなのですが以下であってますでしょうか?
大体は問題と思うのですがwhile内がいまいち自信がありません・・・

class Test
{
private $sisid = '';
//SISID生成
private function create_sisid()
{
return session_id();
}
//SISID重複チェック
private function check_sisid()
{
// SISID生成(変数にセット)
$this->sisid = $this->create_sisid();
// SQL発行
$sql = "SELECT key FROM table";
//上記sqlで取得した値を$tmpに値を格納
//$tmp[0] = 1番目のkey
//$tmp[1] = 2番目のkey
//$tmp[2] = 3番目のkey・・・のように最後まで配列で取得

//ここで重複チェックしてSISIDが同じ値であれば再度SISIDを生成
//生成されたSISIDと$valが同じ値な場合は繰り返し処理を行いたい。
while (list($val) = $tmp) {
if ($val == $this->sisid) {
// 値が同じ場合SISIDを再度生成し再度重複チェック(変数にセット)
$this->sisid = $this->create_sisid();
} else {
break;
}
}
}
return $this->sisid;
}
}

またこのような処理を行うにあたり多数のデータが存在する場合DBに掛かる負荷は大きくなりますか?

A 回答 (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はなくても大丈夫ですよ。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
>whileはtrueの時のみループを実行しますので
foreachやforはよく使うのですがwhileは使用する癖が全くなかったもので初めて知りました^^;
おかげ様で無事に解決です。ありがとうございました^^

お礼日時:2009/09/27 12:10

まずはじめに、


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;
}

補足日時:2009/09/27 02:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!