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
相关产品推荐
相关产品推荐

