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に掛かる負荷は大きくなりますか?
No.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はなくても大丈夫ですよ。
お返事ありがとうございます。
>whileはtrueの時のみループを実行しますので
foreachやforはよく使うのですがwhileは使用する癖が全くなかったもので初めて知りました^^;
おかげ様で無事に解決です。ありがとうございました^^
No.1
- 回答日時:
まずはじめに、
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Java Java 南京錠 2 2023/02/04 11:46
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- Visual Basic(VBA) VBA GetAttrについて教えてください 2 2022/12/22 15:25
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
String だと「 ByRef引数の型が...
-
phpで表示件数をcsvの項目ごと...
-
Smartyを使って、テーブルを表示
-
PHPでテキストファイルの一部を...
-
PHPの配列の中の要素の日付でソ...
-
$_SESSIONに二次元配列を使える...
-
配列のランク付け
-
配列を回すとき、最後の要素だ...
-
チェックボックス複数選択 mys...
-
SQL文の実行結果を変数で受けて...
-
PHP 多次元配列変数のデータ受...
-
PHPのループ数限界値について
-
PHP 配列の添字に変数は使えない?
-
Yahoo API WEB検索の事で!
-
あいまい検索
-
配列をmysqlに保存
-
file_existsでファイル名の部分...
-
postgresql関数をつかったレコ...
-
レンタルサーバでMYSQLに...
-
3次元配列を2次元配列にする方...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
$_SESSIONに二次元配列を使える...
-
file_existsでファイル名の部分...
-
配列をループでたくさん宣言し...
-
foreachのなかで次のキーを参照...
-
String だと「 ByRef引数の型が...
-
PHPのカッコ[ ]の使い方について
-
配列を回すとき、最後の要素だ...
-
配列一致(要素順番は違うが内容...
-
チェックボックス複数選択 mys...
-
漢字のソートについて
-
postgresql関数をつかったレコ...
-
ネストが深い時のforeachはどう...
-
URLのサブドメインとドメイン部...
-
OCI で、SELECT結果行数を取得...
-
$_POSTを一括してサニタイズし...
-
【Smarty】foreach関数やsectio...
-
チェックボックスが複数選択で...
-
phpで、連想配列を普通の配列に...
-
PHP 多次元配列変数のデータ受...
-
PHPで配列をPOSTデータで送った...
おすすめ情報