ldap_sort()
方法时,它返回已弃用的方法
。为什么?有没有等效的方法?
此外,在过滤器中是否可以按A-Z排序?
ldap_sort
是基于一个C函数的,这个函数已经被淘汰多年了。由于ldap_sort
通常不会实现大多数人认为的功能,我们决定弃用PHP函数。
特别是当结果也可以通过用户自定义代码实现时。请查看https://github.com/zendframework/zend-ldap/blob/master/src/Collection/DefaultIterator.php#L379-L403,了解我们如何在zend-ldap中解决此问题。您可以使用任何排序函数来获得所需的排序,而不必受限于在ldap_sort
中实现的排序算法,但没有人真正知道它是如何排序的。
当您使用用户自定义的函数进行排序时,可以根据您特定的情况实现所需的排序方式。按多个属性排序,按大小写敏感排序等等。
替代方案是使用服务器端排序,
a) 需要我们在PHP的C代码中实现LDAP-COntrols(目前还未完成)和 b) 服务器需要实现该控件
由于我们尚未(尚)成功完成该功能,因此此功能目前在PHP中不可用。这是更好的解决方案,但由于服务器上可能没有此功能,因此您可能仍然希望在客户端上进行排序。当您使用分页结果多次搜索时,仍需要手动对结果进行排序。
因此,ldap_sort
因某些原因被弃用,但仍然可用。它将在所有PHP 7.x分支中提供。但是,您应该使用不同的排序解决方案。我们希望能够在PHP 8中提供服务器端排序(尽管不知道何时会到来),但这可能对您没有帮助,因为它取决于服务器的功能。
因此,获取您的结果,将它们添加到数组中并为该数组实现排序函数是您可以做的最简单的事情,并且该排序算法正是您想要的!
$sr=ldap_search($test_ldap, $base, $filter, $attrs, 0, -1, -1, LDAP_DEREF_NEVER, [['oid' => LDAP_CONTROL_SORTREQUEST, 'value' => [['attr'=>'samaccountname']]]]);
将执行服务器端排序。
与分页搜索结果结合使用时,它看起来像这样:
$cookie = '';
do {
$request_controls=[['oid' => LDAP_CONTROL_PAGEDRESULTS, 'value' => ['size' => 2, 'cookie' => $cookie]], ['oid' => LDAP_CONTROL_SORTREQUEST, 'value' => [['attr'=>'samaccountname']]]];
$sr = ldap_search($ldap, $base, $filter, $attribs, 0, 0, 0, LDAP_DEREF_NEVER, $request_controls );
ldap_parse_result($ldap, $sr, $errcode , $matcheddn , $errmsg , $referrals, $response_controls);
$results = ldap_get_entries($ldap, $sr);
for ($i=0; $i<$results["count"]; $i++) {
echo($results[$i]['samaccountname'][0]); echo('<br>');
}
if (isset($response_controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'])) {$cookie = $response_controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie']; } else { $cookie = ''; }
} while (!empty($cookie));
// because PHP usort() cannot iterate using $array['count'], so need implement this quicksort()
function quickSort(&$array, $compare, $start, $end)
{
$partition = function (&$array, $start, $end) use (&$partition, $compare) {
if ($start >= $end) {
return;
}
$pivot = $array[$start];
$left = $start;
$right = $end;
while ($left <= $right) {
while ($compare($array[$left], $pivot) < 0) {
$left += 1;
}
while ($compare($array[$right], $pivot) > 0) {
$right -= 1;
}
if ($left > $right) {
break;
}
list($array[$left], $array[$right]) = [$array[$right], $array[$left]];
$left += 1;
$right -= 1;
}
$partition($array, $start, $right);
$partition($array, $left, $end);
};
$partition($array, $start, $end);
}
function ldapSort(array &$entries, $key)
{
$SORT_KEY = 'SortValue';
$key = strtolower($key);
for ($i = 0; $i < $entries['count']; $i++) {
$entry = &$entries[$i];
$attributes = array_change_key_case($entry, CASE_LOWER);
$entry[$SORT_KEY] = isset($attributes[$key][0]) ?
$attributes[$key][0] : null;
}
unset($entry);
quickSort(
$entries,
function ($a, $b) use ($SORT_KEY) {
$a = $a[$SORT_KEY];
$b = $b[$SORT_KEY];
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
},
0, // start
$entries['count'] - 1 // end
);
}
使用方法
$entries = ldap_get_entries($ldap, $result);
ldapSort($entries, 'displayname');
'ldap_sort' => array(
'7.0' => false,
'alternative' => null,
),
ldap_sort
将从PHP 7.0版本开始被弃用,并且它的alternative = NULL
表示没有替代方法。LDAP控制扩展,用于服务器端排序搜索结果
。您需要检查您使用的LDAP实现(因为它没有在问题中标记)是否实现了此控件来按A-Z进行排序。