1. 程式人生 > >關於PHP下級自動下滑的一點小見解

關於PHP下級自動下滑的一點小見解

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下級自動下滑的一點小見解