ホームページ  >  記事  >  バックエンド開発  >  php forループのアイデアの問題

php forループのアイデアの問題

WBOY
WBOYオリジナル
2016-06-23 13:41:03836ブラウズ

私は PHP の初心者で、最近プロジェクトを開発し、バイナリ ツリー システムの福祉賞を求めました。書き込み後の実行効率が低すぎます。専門家にアドバイスを求めてください。画像の説明
1. 1W 程度のパフォーマンスを持つ人が監督者とみなされます。管理体制の下に管理者である監督者が 2 名います。管理体制の下に取締役である管理者が2名います。メンバー0名、スーパーバイザー1名、マネージャー2名、取締役3名。
私が書いたコードは以下の通りです:
//福祉賞が始まります
unset($map);//マップ変数の値を破棄します
$map['_string']=" datediff(curday,'".$beginday. "') //全メンバーのパフォーマンスをクエリ
$hyyjlist=$hyyj->where($map)->field(' userid,sum(leftyj1)+sum(leftyj2) as sumleft' )-> group('userid')->select();
$glrCountArry=array();//キー: スーパーバイザー名+flrjl 値: 人数 スーパーバイザーの数を保存する配列
foreach ($hyyjlist as $hkey=>$hvalue ){//ループ内でユーザーのスーパーバイザー特典を更新します
if($hvalue['sumleft']>=10000){
$us=$userListArry[$hvalue['userid'] ];//3 ID に基づいてメンバーを取得します
if($us['flstate']==0){//ステータスはメンバー 0 です
if($salary1->where(array('periods'=> $periods,'userid'=>$us[ 'id']))->setField(array('flj'=>'zスーパーバイザー賞内容z'))===false){
$salary-> rollback();
$this-> error('福利厚生の更新に失敗しました') }
for(!empty($us['gluser']),$i=0;$i if(!array_key_exists($us['gluser']."flrzg", $glrCountArry)){
$glrCountArry[$us[ 'glrzg']."flrzg"]=1;
}else{
$glrCountArry[$us['glrzg"]+=1;
$us=$userNameListArry[$us['gluser ']];
if(empty($us) ){
$i=count($userlist)
}
}
}
}
}
$find['state']=array('eq',1) );//state=1 アクティブ化
$find[ '_string']="from_unixtime(confirmtime,'%Y-%m-%d')<='".$beginday."'";//アクティブ化日この期間の時間
$list2=$users-> where($find)->select();// メンバーリストをクエリします
$glrCountArry2=array();// キー: マネージャー名+flrjl 値:人数 マネージャーの数を保存する配列
foreach ($list2 as $key= >$value){// マネージャーの特典を取得する
$us=$value
if($us['flstate']==1; ){
for(!empty($us['gluser']),$i =0;$i if( $glrCountArry[$us['username']."flrzg"]>0){/ /メンバーはスーパーバイザー レベルであり、配列内のスーパーバイザーの数は 0 より大きいです。メンバーのマネージャー特典を更新します
if( $salary1->where(array('periods'=>$periods,'userid'=>$us['id' ]))->setField(array('flj'=>'zマネージャー賞内容z '))===false){
$salary->rollback();
$this->error(' 福利厚生賞の更新に失敗しました 2');
}
}
if(!array_key_exists($us[' glruser']."flrjl", $glrCountArry2)){// メンバーの上位マネージャーを 1 つ増やします
$glrCountArry2[$us ['glrjl"."flrjl"]=1;
}else{
$glrCountArry2 [$us['gluser']."flrjl"]+=1;
}
$us=$userNameListArry[$us[' gluser']]
if(empty($us)){
$i=count ($userlist);
}
}
}else if($value['flstate']==0){//メンバー レベル スーパーバイザーではありません。配列内のスーパーバイザーの数は 1 より大きいです。メンバーのマネージャーを更新します。特典
for(!empty($us['gluser']),$i=0;$i if($glrCountArry[ $us['username']."flrzg"]>1){//メンバーはスーパーバイザー レベルであり、配列内のスーパーバイザーの数は 0 より大きいです。メンバーのマネージャー特典を更新します
if ($salary1-> where(array('periods'=>$periods,'userid'=>$us['id']))->setField(array('flj'=>'zmanager Award contentz'))== =false){
$salary->rollback();
$this->error('福利厚生賞の更新に失敗しました 2');
}
}
if(!array_key_exists($ us['gluser']) flrjl", $glrCountArry2)){// メンバーの上位マネージャーを +1 します
$glrCountArry2[$us['gluser']."flrjl"]=1;
}else{
$ glrCountArry2[$us[' gluser']."flrjl"]+=1;
}
$us=$userNameListArry[$us['gluser']]
if(empty($us)){
$i= count($userlist);
}
}

}
}
foreach ($list2 as $key=>$value){// ディレクターの特典を取得します
$us=$value
if($us['flstate ']==2) {//ステータスはマネージャー 2 名です
for(!empty($us['gluser']),$i=0;$i if($glrCountArry2[$us['username']."flrjl"]>0){//メンバーはマネージャー レベルで、配列内のマネージャーの数は 0 より大きいです メンバーのディレクター特典を更新します
if($salary1->where(array('periods'=>$periods,'userid'=>$us['id']))->setField(array('flj'=>'z)ディレクター賞の内容 z'))===false){
$salary->rollback();
$this->error('福利厚生賞の更新に失敗しました 3'); $us=$userNameListArry [$us['glstate']];
if(empty($us)){
$i=count($userlist); }
}
}else if($value['flstate']<2) {//ステータスはマネージャーのステータスではありません。配列内のマネージャーの数が 2 に達する限り、メンバーのディレクター特典は更新されます
for(!empty($us['gluser']),$i= 0;$i if($glrCountArry2[$us['username']."flrjl"]>1){/ / メンバーはマネージャー レベルであり、配列内のマネージャーの数は 1 より大きいです メンバーのディレクター特典を更新します
if($salary1->where(array('periods'=>$periods,'userid'=>) ;$us['id']))->setField(array('flj '=>'zディレクター賞内容z'))===false){
$salary->rollback(); >error('福利厚生賞の更新に失敗しました 3');
}
}
$us=$userNameListArry[$us['gluser']]
if(empty($us)){
$i=count($ userlist);
}
}
}
}
//福利厚生賞は終了します




ディスカッション(解決策)への返信

ビジネスのニーズを言葉で説明してください。 この方法でのみ、コードのどこに問題があるかを知ることができますか?

メンバーが自分の名前で新しい人を推薦することを意味します。たとえば、1 人を推薦すると 1,000 元を受け取ることができます。推薦人数が1Wに達するとスーパーバイザーとなり、スーパーバイザー賞を獲得できる。自分の名前の人に上司が 2 人いる場合、その人がマネージャーとなり、マネージャー賞を受賞します。

テーブル構造とは何ですか?それは更新コマンドで行うべきです

私が書いたアイデアは、彼の名前でのパフォーマンスが10,000に達すると、このメンバーがスーパーバイザー賞を獲得するというものです。そして、上層部に回覧して、その上のマネージャーが経営賞を受賞するようにします。その後、メンバーシップが再び循環され、彼の名前の下に 2 人の上司がいる場合は、彼がマネージャー賞を獲得し、その後、彼の上司全員がマネージャー賞を獲得します。

現在の問題は、この二重ループ操作の効率が低すぎることです。8000 個のデータを実行するのに 3 分かかりました。アイデアや方法を最適化するにはどうすればよいでしょうか?

もう一度言ってください。自分のデータがテーブルにどのように保存されているかを確認する必要があります

あなたの考えに何か間違っている可能性があるため


以下に簡単な例を示します: A の下に 2 人のメンバーがいます。メンバー登録には 1,000 元がかかり、その上位のメンバーには 1,000 元がかかります管理者は登録のパフォーマンスを取得します。

メンバー-》スーパーバイザー-》マネージャー-》ディレクター

B1、B2、C1、C2が新規会員登録した場合、人数に応じてBの成績は2000、Cの成績は2000、Aの成績は6000となります。
これから行うべき機能は、会員の福利厚生賞です。メンバーのパフォーマンス = 10,000 の場合、メンバーはスーパーバイザー賞を受け取ることができます。メンバーの下にマネージャーが2人いる場合、そのメンバーは

マネージャー賞を獲得できます。メンバーの名前にマネージャーが2人いる場合は、メンバーがディレクター賞を受賞します。

例えば、B1 の成績が 1W に達した場合、B1 は監督賞、B は監督賞を獲得します。 A、B1の下に上司が2人いますが、B1が部長賞を受賞しました。等々。 。 。
私が書いたコードに問題があります。何かアイデアがあれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。