You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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);

代码说明

  1. 解析DN路径:拆分每个OU的DN,过滤出所有OU=开头的组件,反转后得到从顶层OU到当前OU的路径(比如原来的Sub Group a1, Group A变成Group A, Sub Group a1)。
  2. 构建树形数组:通过引用变量$currentNode,沿着路径逐层创建嵌套数组,把每个OU放到对应的父节点下。
  3. 递归渲染列表:用递归函数遍历树形数组,根据层级添加缩进空格,输出你想要的树形列表格式。

这个方案支持任意深度的子OU,不管是两层还是多层嵌套都能正确处理。

内容的提问来源于stack exchange,提问作者user4185677

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:18:36