php如何获取foreach+递归返回的数组

半吊子出身,被一个会员系统绕晕了。

需求

排长培养出五个新班长,并且管理人数达到20名时,排长可荣升为连长。
连长培养出五个新排长,并且管理人数达到50名时,连长可荣升为营长。
营长培养出五个新营长,并且管理人数达到80名时,营长可荣升为团长。
以此类推,会员全部推荐加入

现在在某个人被邀请加入后,默认是班长,要从数据库中按推荐线查找所有上级是否满足升级条件,满足的调整级别。

用了/Zizaco/entrust的role做了级别,拿营长为例,我的思路是先筛选出了管理的人数在50-80之间的会员,然后循环查找这些会员的下级并统计这些下级的用户组,合并后放到一个数组,最后统计这个数组中营长用户组的个数是否达到了5个,如果达到5个并且当前用户的用户组是营长的就升级为团长。

问题

在循环查找下级的时候遇到问题,不清楚该如何合并每次循环得到的数组,把所有下级的用户组数量和直接下级合并成一个数组。
类似
array(
'张三' => 2, 张三有2个直接下级
'排长' => 3, 所有下级里排长有三个
’连长‘ =>4, 所有下级里连长有四个
)

   public static function getchildroles($phone,$name)
    {
        //根据手机号查找第一层子元素
        $children = User::where('tphone',$phone)->get();
        if(!empty($children))
        {
            //获取第一层子元素数量
            $childonenum = array($name => $children->count());
            //循环第一层子元素
            //$result = array();
            foreach($children as $child)
            {
                //获得第一层子元素的用户组
                $child_rolename = $child->roles->first()->name;
                //echo $child_rolename;
                //依次存入数组
                $data[] = $child_rolename;
                //获得一层子元素的手机号
                $child_phone = $child->phone;
                $child_name = $child->name;
                $data = array_merge($childonenum, $data);
                //$result = array_merge($result, $data);
                self::getchildroles($child_phone,$child_name);
                print_r($data);
            }
            //$data = array_merge($data, $data);
            //print_r($result);
            //return $result;
        }
    }