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

PHP-ldap服务端多条件排序实现问题

PHP-ldap服务端多条件排序实现问题

哈喽,刚好我之前也碰到过这个问题,PHP 8把ldap_sort()废弃之后,用LDAP控制实现服务端排序确实是官方推荐的替代方案,而且多条件排序的实现其实比你想的简单,只要调整LDAP_CONTROL_SORTREQUEST的参数结构就可以啦!

你之前的单条件排序代码是完全没问题的,比如按姓氏sn排序:

$request_controls=[
    ['oid' => LDAP_CONTROL_PAGEDRESULTS, 'value' => ['size' => 750, 'cookie' => $cookie]],
    ['oid' => LDAP_CONTROL_SORTREQUEST, 'value' => [['attr' => 'sn']]]
];
$result = ldap_search($ldap_conn, $WhoisBaseDN, $filter, 
    ['sn', 'c', 'o', 'departmentnumber', 'employeeid', 'givenname', 'title', 'ipphone', 'telephonenumber', 'mobile', 'mail'], 
    0, 0, 0, LDAP_DEREF_NEVER, $request_controls);

如果要实现多条件排序(比如先按姓氏排序,姓氏相同的情况下按名字排序),只需要在LDAP_CONTROL_SORTREQUEST的value数组里添加多个排序规则的子数组即可,数组的顺序就是排序的优先级:

$request_controls=[
    ['oid' => LDAP_CONTROL_PAGEDRESULTS, 'value' => ['size' => 750, 'cookie' => $cookie]],
    ['oid' => LDAP_CONTROL_SORTREQUEST, 'value' => [
        ['attr' => 'sn'], // 第一排序条件:姓氏(升序)
        ['attr' => 'givenname'] // 第二排序条件:名字(升序)
    ]]
];
$result = ldap_search($ldap_conn, $WhoisBaseDN, $filter, 
    ['sn', 'c', 'o', 'departmentnumber', 'employeeid', 'givenname', 'title', 'ipphone', 'telephonenumber', 'mobile', 'mail'], 
    0, 0, 0, LDAP_DEREF_NEVER, $request_controls);

要是需要某个条件按降序排列,还可以在对应的子数组里加上reverse键并设置为true,比如姓氏降序、名字升序的写法:

$request_controls=[
    ['oid' => LDAP_CONTROL_PAGEDRESULTS, 'value' => ['size' => 750, 'cookie' => $cookie]],
    ['oid' => LDAP_CONTROL_SORTREQUEST, 'value' => [
        ['attr' => 'sn', 'reverse' => true], // 姓氏降序
        ['attr' => 'givenname'] // 名字升序
    ]]
];

原理其实很简单:LDAP的SORTREQUEST控制本身就支持多排序键,PHP的ldap_search()在处理这个控制参数时,会自动把value里的多个子数组转换成对应的LDAP排序键序列,服务端会严格按照你给出的顺序依次执行排序逻辑。

备注:内容来源于stack exchange,提问作者ilionel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 08:15:33