无限级平台必须解决的一个问题,分享一下我在网上学习到的方法。
假设平台有这样的上下级关系
A 有 2 个直接下级B、C,? ? B有2个直接下级D、E,? ? C有2个直接下级F、G
我们正常的做法是使用递归这样操作:先查询出所有上级为A的子商户,再查询所有上级为上一个查询结果的子商户。如第一步查询出B、C,第二步查询所有上级为B、C的商户(mysql的 IN 范围条件实现)。
这样的递归查询耗时是非常长的。(个人觉得具体消耗在连接mysql数据库的次数上)
现在我们的做法是这样的:一次性查询出所有的商户信息(id、上级id),并且按正序排列(添加时间,因为要有第三级的商户必须先有第二级商户,按正序排列才可以正常得到结果)
<?php
function?getTeamMember($allMembers,?$id){
????$teams????????=?[];?????????//?在$id下的所有商户id数组,最终的返回结果
????$teams[$id]???=?$id;?????//?把我们要查询的这个id先添加在这个数组里,设置的值任意,只要让这个键值存在即可。
????
????//?遍历每一个会员信息
????foreach($allMembers?as?$key?=>?$v){
????????//?判断遍历到的这个会员上级是否在团队数组里?(判断键值)
????????if(?isset(?$teams[$v['p_id']?]?)?){
????????????//?该会员的上级属于团队?追加进团队
????????????$teams[?$v['id']?]?=?123;??//?也是任意值?存在即可
????????}
????????//?遍历完就把这个会员的信息删除~不需要储存了
????????unset($allMembers[$key]);
????}
????//?把我们第二步传递进来的自身的$id删除掉?也就是第一个
????unset($teams[$id]);
????//?返回数据
????return?array_keys($teams);
}