php - 如何使用 LDAP 过滤器对 LDAP 结果进行排序?

标签 php sorting ldap

我正在使用 PHP 创建 LDAP 目录搜索。

我能够成功搜索并返回结果。

我希望能够根据层次结构对结果进行排序。 现在我有:

 ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com  
 ou=IT,ou=Employees,ou=People,dc=instatsport,dc=com  
 ou=Video,ou=Employees,ou=People,dc=instatsport,dc=com  
 ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com  
 ou=aHR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com  
 ou=HR2,ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com

使用 php.net/manual/en/function.ldap-sort.php 应该应用什么过滤器来获得这个结果?:

ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
ou=HR2,ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
ou=aHR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
ou=IT,ou=Employees,ou=People,dc=instatsport,dc=com
ou=Video,ou=Employees,ou=People,dc=instatsport,dc=com 

最佳答案

你不能使用 ldap_sort

此函数所做的是对返回条目的属性应用 strcmp

在这里,您尝试对返回条目的 DN 进行排序,而不是按字母顺序排列,而是按层次排列。

你必须实现这个(或找到已经这样做的人)。

最简单的实现是创建一个包含所有 RDN 的树,然后从根到叶递归地打印这棵树,用逗号内爆每个 RDN。

编辑:

我花了一些时间尝试快速实现它,这不是你能找到的最好的代码,但它可以为你想要实现的目标奠定基础:

function hierarchySort ($a, $b){
        $rdn1 = ldap_explode_dn($a,0);
        $rdn2 = ldap_explode_dn($b,0);

        $count = $rdn1["count"] < $rdn2["count"] ? $rdn1["count"] : $rdn2["count"];

        for ($i=0; $i<$count; $i++) {
                $j1 = $rdn1["count"] - 1 - $i;
                $j2 = $rdn2["count"] - 1 - $i;
                $ret = strnatcasecmp($rdn1[$j1], $rdn2[$j2]);
                if ($ret != 0) break;
        }

        if ($rdn1["count"] == $rdn2["count"]) {
                return $ret;
        }else {
                if ($ret != 0) return $ret;
                else return  $rdn1["count"] < $rdn2["count"] ? -1 : 1;
        }
}

// Some simulated LDAP result
$entries = [
        0 => [ "dn" => "ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com" ],
        1 => [ "dn" => "ou=IT,ou=Employees,ou=People,dc=instatsport,dc=com" ],
        2 => [ "dn" => "ou=Video,ou=Employees,ou=People,dc=instatsport,dc=com" ],
        3 => [ "dn" => "ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com" ],
        4 => [ "dn" => "ou=aHR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com" ],
        5 => [ "dn" => "ou=HR2,ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com" ],
        "count" => 6
];

for ($i=0; $i<$entries['count']; $i++) {
        $e = $entries[$i];
        $dns[] = $e["dn"];
}

print_r($dns);
usort($dns, 'hierarchySort');
print_r($dns);

输出:

Array
(
    [0] => ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
    [1] => ou=IT,ou=Employees,ou=People,dc=instatsport,dc=com
    [2] => ou=Video,ou=Employees,ou=People,dc=instatsport,dc=com
    [3] => ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
    [4] => ou=aHR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
    [5] => ou=HR2,ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
)
Array
(
    [0] => ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
    [1] => ou=aHR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
    [2] => ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
    [3] => ou=HR2,ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com
    [4] => ou=IT,ou=Employees,ou=People,dc=instatsport,dc=com
    [5] => ou=Video,ou=Employees,ou=People,dc=instatsport,dc=com
)

关于php - 如何使用 LDAP 过滤器对 LDAP 结果进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46531368/

相关文章:

c++ - c++ - 如何在c++中按降序对基于第二个元素的对列表进行排序

java - 如何在 android 中使用 UnboundID LDAP?

php - 下拉设置 session 变量

php - 在 Symfony2 中将 SecurityContext 注入(inject)监听器 prePersist 或 preUpdate 以获取 createdBy 或 updatedBy 中的用户导致循环引用错误

php - 在订单中挑选号码

java - Java 中的合并排序未按预期工作。尝试在没有 while 循环的情况下做到这一点

azure - Spring Security支持多种身份验证类型

python - 在Mac OS X上安装Python包时如何指定使用的SDK版本?

php - 多语言站点: Cookie or URL Element

php - 如何在 PHP 中使用 Graph API 使用 message_tags 字段发布消息