如何使用PHP获取Active Directory的LDAP树形结构?
如何将扁平的AD OU列表转换为层级树形结构
看起来你已经通过LDAP拿到了所有OU的基础数据,接下来只需要利用每个OU的dn属性解析层级关系,就能把扁平列表转换成你想要的缩进树形结构了。我来给你一步步拆解解决方案:
首先明确你期望的输出效果:
- Group A
- Sub Group a1
- Sub Group a2
- Group B
- Sub Group b1
- Sub Group b2
- Group C
- Sub Group c1
- Sub Group c2
你的现有代码已经获取到了包含dn和ou属性的OU列表,接下来我们要做的就是从dn里提取层级关系,构建树形结构,再输出成缩进列表。
核心思路
每个OU的dn(比如OU=Sub Group a1,OU=Group A,DC=example,DC=com)已经包含了完整的父级路径信息,我们可以拆分这个DN,提取出所有OU组件,反转后得到从父到子的层级顺序,然后用这个顺序构建嵌套数组,最后递归遍历数组生成缩进列表。
完整代码实现
// 你的现有LDAP查询代码 $ldap_base_dn = 'DC=example,DC=com'; $filter="(objectClass=organizationalunit)"; $arr= array("dn", "ou"); $sr=ldap_search($ldap_connection, $ldap_base_dn, $filter, $arr); $entries = ldap_get_entries($ldap_connection, $sr); // 步骤1:构建OU树形数组 $ouTree = []; for ($i = 0; $i < $entries['count']; $i++) { $dn = $entries[$i]['dn']; $ouName = $entries[$i]['ou'][0]; // 拆分DN为各个组件,提取所有OU部分 $parts = explode(',', $dn); $ouPath = []; foreach ($parts as $part) { if (strpos($part, 'OU=') === 0) { // 兼容PHP全版本的写法 $ouPath[] = substr($part, 3); } } // 反转路径,得到「父OU -> 子OU」的顺序 $ouPath = array_reverse($ouPath); // 逐层插入树形数组 $currentNode = &$ouTree; foreach ($ouPath as $segment) { if (!isset($currentNode[$segment])) { $currentNode[$segment] = []; } $currentNode = &$currentNode[$segment]; } } // 步骤2:递归输出缩进树形列表 function renderOuTree($tree, $indent = 0) { $indentSpaces = str_repeat(' ', $indent); foreach ($tree as $ouName => $children) { echo "- {$indentSpaces}{$ouName}\n"; if (!empty($children)) { renderOuTree($children, $indent + 1); } } } // 执行输出 renderOuTree($ouTree);
代码说明
- 解析DN路径:拆分每个OU的DN,过滤出所有
OU=开头的组件,反转后得到从顶层OU到当前OU的路径(比如原来的Sub Group a1, Group A变成Group A, Sub Group a1)。 - 构建树形数组:通过引用变量
$currentNode,沿着路径逐层创建嵌套数组,把每个OU放到对应的父节点下。 - 递归渲染列表:用递归函数遍历树形数组,根据层级添加缩进空格,输出你想要的树形列表格式。
这个方案支持任意深度的子OU,不管是两层还是多层嵌套都能正确处理。
内容的提问来源于stack exchange,提问作者user4185677
相关产品推荐
相关产品推荐

