我是PHP新手,最近開發項目求二叉樹體系的福利獎。寫完後執行效率太低。求高手大神指點一下思路。圖片說明
1.左右業績達到1W就是主管。 管理體系下有2個主管就是經理。管理體系下有2個經理就是董事。 0會員,1主管,2經理,3董事。
我寫的代碼如下:
//福利獎開始
unset($map);//銷毀map變數值
$map['_string']=" datediff(curday,'".$beginday."')<=0";
//查詢所有會員業績
$hyyjlist=$hyyj->where($map)->field(' userid,sum(leftyj1)+sum(leftyj2) as sumleft')->group('userid')->select();
$glrCountArry=array();//key:主管name+flrjl value:人數 儲存主管人數的 數組
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['gluser']."flrzg"]=1;
}else{
$glrCountArry[$us['gluser']."flrzg"]+=1;
}
$us=$userNameListArry[$us['gluser']];
if(empty($us)){
$i=count($userlist);
}
}
}
}
}
$find['state']=array('eq',1);//狀態=1啟用
$find['_string']="from_unixtime(confirmtime,'%Y-%m-%d')<='".$beginday."'";//啟用日期本期時間
$list2=$users->where($find)->select();//查詢會員列表
$glrCountArry2=array();// key:經理name+flrjl value:人數 儲存經理人數的 數組
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['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);
}
}
}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'=>'z經理獎內容z'))===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['gluser']];
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();
$this->error('福利獎更新失敗3');
}
}
$us=$userNameListArry[$us['gluser']];
if(empty($us)){
$i=count($userlist);
}
}
}
}
//福利獎結束
回複討論(解決方案)
請用文字描述你的業務需求!
這樣才可能知道你的代碼的問題出在哪裡?
就是會員推薦新人到他的名下,一個會員能推薦2個人,比如推薦一個人得1000元。 當他推薦的人的金額達到1W時,他就成了主管,就能拿主管獎。當他名下的人有2個主管時,他就是經理,拿經理獎。
表結構是怎樣的?應該用 update 指令就可完成的
我寫的思路是,迴圈所有會員,當他名下的業績達到1W,這個會員拿主管獎。然後迴圈上層,使他上層的管理者都拿管理獎。然後再迴圈一次會員,當他名下有2個主管時他拿經理獎,然後迴圈他的上層都拿經理獎。
現在問題是這個雙重迴圈啟動並執行效率太低,我8000條資料 運行了3分鐘。怎麼能最佳化下思路或者方法?
再說一遍。需要看到你的資料在表中是怎麼存放的
因為可能是你的思路有問題
簡單舉下例子: A 下有2個會員,註冊會員需要1000元,他們的上層都得到註冊的業績。
B C 他們下邊也有會員
B1 B2 C1 C2 會員等級劃分:會員-》主管-》經理-》董事。
如果B1,B2,C1,C2註冊成新會員,B的業績就是2000,C的業績是2000 ,A的業績是6000,按人頭數算的。
現在要做的功能是,會員的福利獎。當會員下的業績=10000的時候,會員可以得到主管獎。當會員下有2個主管的時候,會員可以
得到經理獎。當會員名下有2個經理的時候,會員得到董事獎。
比如B1下的業績達到1W,那麼B1得到主管獎,B得到主管獎。A下有2個主管B,B1得到經理獎。以此類推。。。
我寫的代碼有問題,希望得到個思路,謝謝了。