$agent) { $seen=[]; $cursor=$id; $level=0; while (isset($map[$cursor])) { if (isset($seen[$cursor])) throw new ApiException('代理上下级关系存在循环'); $seen[$cursor]=true; $level++; $parent=$map[$cursor]['parent_id']; if ($parent===null) { $level=null; break; } if ((int)$parent===0) break; $cursor=(int)$parent; if (!isset($map[$cursor])) throw new ApiException('上级代理不存在'); } if ($level!==null && $level>3) throw new ApiException('代理团队最多支持三级'); $levels[$id]=$level; } return $levels; } public function validate(array $agents,int $id,?int $parent): void { $map=array_column($agents,null,'id'); if ($parent!==null && $parent!==0) { if (!isset($map[$parent])) throw new ApiException('上级代理不存在'); if ((int)$map[$parent]['status']!==1 && ($map[$id]['parent_id']??null)!=$parent) throw new ApiException('不能归属已停用代理'); if (($this->levels($agents)[$parent]??null)===null) throw new ApiException('请先设置上级代理的等级'); } $map[$id]=array_replace($map[$id]??['id'=>$id,'status'=>1],['parent_id'=>$parent]); if ($parent===null) foreach ($map as $row) if ((int)($row['parent_id']??0)===$id) throw new ApiException('存在下级代理,不能清空等级'); $this->levels(array_values($map)); } }