關於PHP下級自動下滑的一點小見解
阿新 • • 發佈:2019-03-06
false 方法 所在 順序 ont ids lse erl 滑動
這兩天需要項目中有一個小小的功能:
功能如下:假設現有一個最頂級的上級1,1可發展下級,但是1只有A區和B區兩個能存儲發展的下級ID且A區和B區分別只能存儲一個下級ID,如果繼續發展下級但A和B皆存儲有ID,則將1所發展的下級下滑至1 A區(別名2)存儲ID的A區,如果2(即1A區存儲的下級)的存儲區同樣是滿的情況下,則平行滑動值1 B區(別名3) 的存儲區內,如果3同樣是滿的情況下,繼續類推,繼續向下一直到有空位置存儲的地方,。。。。
功能是不是看的很懵,本渣同樣感覺如此,即上圖解釋:
即如同所示,發展下級按照依次向下,如果平級則從左至右的順序。
功能分析,主要實現兩大塊,一時 下級的自動下滑,二是獲取下滑所在的位置。
首先,先建立了一個測試表:
-- id id -- user_id 用戶ID -- a A區 -- b B區 -- p_uid 上級ID -- z_id 所在位置id --雙軌下滑表, ceshi create table ceshi( id int(11) not null primary key auto_increment, user_id int(11) default null comment ‘用戶ID‘, a int(11) default null comment ‘A區‘, b int(11) default null comment ‘B區‘, p_uid int(11) default ‘0‘ comment ‘上級ID‘, z_id int(11) default ‘0‘ comment ‘所在位置,如是頂級則為0‘, addtime varchar(10) default null comment ‘添加時間‘ );
應為使用的是TP5框架來進行編寫的,所以我就講代碼封裝到common.php中
首先呢是先判斷第一個添加的(即是最頂級的ID)
/** * 雙軌下滑首個添加 */ function addfuser($user_id,$p_uid) { if($p_uid != ‘0‘) { $puser = model(‘Ceshi‘)->where(‘user_id‘,$p_uid)->find()->toArray(); $aaa = addUsersCeshi($puser,$user_id); return true; exit; } else { model(‘Ceshi‘)->save([ ‘user_id‘ => $user_id, ‘p_uid‘ => $p_uid, ‘addtime‘ => time(), ]); return true; exit; } }
然後根據如果不是最頂級的則調用封裝的addUsersCeshi()方法來進行下滑查詢添加:
function addUsersFuser($puser,$user_id) {
//首先應先判斷上級的 A/B區是否是為存儲的狀態,如果未存儲則直接添加至對應的A/B區中 if(empty($puser[‘a‘])) { model(‘Ceshi‘)->insert([ ‘user_id‘ => $user_id, ‘p_uid‘ => $puser[‘user_id‘], ‘z_id‘ => $puser[‘id‘], ‘addtime‘ => time(), ]); model(‘Ceshi‘)->save([‘a‘=>$user_id],[‘id‘=>$puser[‘id‘]]); return true; exit; } if(empty($puser[‘b‘])) { model(‘Ceshi‘)->insert([ ‘user_id‘ => $user_id, ‘p_uid‘ => $puser[‘user_id‘], ‘z_id‘ => $puser[‘id‘], ‘addtime‘ => time(), ]); model(‘Ceshi‘)->save([‘b‘=>$user_id],[‘id‘=>$puser[‘id‘]]); return true; exit; }
//如果上級的A/B區已經滿額則要下滑至對應的下級中,所以,我們就將所有的通過getUsersCeshiMember()方法找到所有的下級同事是按照id順序排列,這樣就可以獲得到所有的下級 $userlist = model(‘Ceshi‘)->order(‘id asc‘)->select(); $res = getUsersCeshiMember($userlist,$puser[‘user_id‘]); $list = model(‘Ceshi‘)->where(‘user_id‘,‘in‘,$res)->order(‘p_uid asc,user_id asc‘)->select(); $list = get_collection($list);
//通過foreach順序查找為空的存儲區,當找到第一個為空的即是下滑到對應的正確區域 foreach ($list as $key=>$val) { if(empty($val[‘a‘])) { model(‘Ceshi‘)->insert([ ‘user_id‘ => $user_id, ‘p_uid‘ => $puser[‘user_id‘], ‘z_id‘ => $val[‘id‘], ‘addtime‘ => time(), ]); model(‘Ceshi‘)->save([‘a‘=>$user_id],[‘id‘=>$val[‘id‘]]); return true; exit; } if(empty($val[‘b‘])) { model(‘Ceshi‘)->insert([ ‘user_id‘ => $user_id, ‘p_uid‘ => $puser[‘user_id‘], ‘z_id‘ => $val[‘id‘], ‘addtime‘ => time(), ]); model(‘Ceshi‘)->save([‘b‘=>$user_id],[‘id‘=>$val[‘id‘]]); return true; exit; } } }
以下為遞歸查詢所有下級的方法getUsersCeshiMember():
/* *獲取某個會員的無限下級方法 ----Ceshi 表數據 *$members是所有會員數據表,$mid是用戶的id */ function getUsersFuserMember($members, $mid) { // echo $mid; // pre($members); $Teams=array();//最終結果 $mids=array($mid);//第一次執行時候的用戶id do { $othermids=array(); $state=false; foreach ($mids as $valueone) { foreach ($members as $key => $valuetwo) { if($valuetwo[‘p_uid‘]==$valueone){ $Teams[]=$valuetwo["user_id"];//找到我的下級立即添加到最終結果中 $othermids[]=$valuetwo[‘user_id‘];//將我的下級id保存起來用來下輪循環他的下級 array_splice($members,$key,1);//從所有會員中刪除他 $state=true; } } } $mids=$othermids;//foreach中找到的我的下級集合,用來下次循環 } while ($state==true); return $Teams; }
下面的是查詢頂級ID下的對應的所有A/B區下級的方法:
/** * 查詢屬於A/B區的用戶---正確的 */ function findFuser($user_id,$type) { $userlist = model(‘Ceshi‘)->order(‘id asc‘)->select(); $list = model(‘Ceshi‘)>where(‘user_id‘,$user_id)->value("$type"); if(!empty($list)) { $res = getUsersFuserMember($userlist,$list); array_push($res, $a); pre($res); } else { return false; } }
最後是本次的成功
以上即完成本次下級自動下滑的功能
望路過的各位大佬、大神,輕虐。
感激不盡。
如果更好的方法想傳授與本渣,請在評論去留言,本渣將不勝感激
再次感謝(∩_∩)
2019年03月06號
關於PHP下級自動下滑的一點小見解