私は 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
$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( $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 ($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($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($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);
}
}
}
}
//福利厚生賞は終了します
ディスカッション(解決策)への返信
ビジネスのニーズを言葉で説明してください。 この方法でのみ、コードのどこに問題があるかを知ることができますか?
テーブル構造とは何ですか?それは更新コマンドで行うべきです
現在の問題は、この二重ループ操作の効率が低すぎることです。8000 個のデータを実行するのに 3 分かかりました。アイデアや方法を最適化するにはどうすればよいでしょうか?
もう一度言ってください。自分のデータがテーブルにどのように保存されているかを確認する必要があります
あなたの考えに何か間違っている可能性があるため
以下に簡単な例を示します: A の下に 2 人のメンバーがいます。メンバー登録には 1,000 元がかかり、その上位のメンバーには 1,000 元がかかります管理者は登録のパフォーマンスを取得します。
B1、B2、C1、C2が新規会員登録した場合、人数に応じてBの成績は2000、Cの成績は2000、Aの成績は6000となります。
これから行うべき機能は、会員の福利厚生賞です。メンバーのパフォーマンス = 10,000 の場合、メンバーはスーパーバイザー賞を受け取ることができます。メンバーの下にマネージャーが2人いる場合、そのメンバーは
例えば、B1 の成績が 1W に達した場合、B1 は監督賞、B は監督賞を獲得します。 A、B1の下に上司が2人いますが、B1が部長賞を受賞しました。等々。 。 。
私が書いたコードに問題があります。何かアイデアがあれば幸いです。