ldap_sort

(PHP 4 >= 4.2.0, PHP 5, PHP 7)

ldap_sort在客户端对 LDAP 结果条目进行排序

警告

此函数从 PHP 7.0.0 开始已被弃用,并从 PHP 8.0.0 开始已被移除。强烈建议不要依赖此函数。

说明

ldap_sort(resource $link, resource $result, string $sortfilter): bool

ldap_search() 返回的 LDAP 搜索结果进行排序。

由于此函数在客户端对返回的值进行排序,因此在您达到服务器的 sizelimit 或在 ldap_search() 中定义的 sizelimit 时,您可能无法获得预期的结果。

参数

link

LDAP 资源,由 ldap_connect() 返回。

result

搜索结果标识符,由 ldap_search() 返回。

sortfilter

用作排序键的属性。

返回值

没有返回值。

变更日志

版本 说明
8.0.0 此函数已被移除。

范例

对搜索结果进行排序。

示例 #1 LDAP 排序

<?php
// $ds 是一个有效的链接标识符(参见 ldap_connect)

$dn = 'ou=example,dc=org';
$filter = '(|(sn=Doe*)(givenname=John*))';
$justthese = array('ou', 'sn', 'givenname', 'mail');

$sr = ldap_search($ds, $dn, $filter, $justthese);

// 排序
ldap_sort($ds, $sr, 'sn');

// 检索数据
$info = ldap_get_entries($ds, $sr);

添加注释

用户贡献的注释 7 个注释

zbaizman at yahoo dot com
20 年前
此注释可能不言自明,但 ldap_sort 的功能让这个有时会使用关系型数据库的用户感到困惑。

以下代码将无法按预期执行

<?php

// 省略连接和绑定到 LDAP 服务器的调用...

// 我们要从 LDAP 服务器检索的属性
$ldap_attributes = array ( 'cn', 'o', 'mail' ) ;

// 从匹配的条目中检索属性
$search_results = ldap_search ( $ldap_conn, 'dc=example,dc=org', '(objectclass=*)', 0, 500, 30 ) ;

// 按姓氏 ('sn') 对条目进行排序
ldap_sort ( $ldap_conn, $search_results, 'sn' ) ;

?>

条目将不会按姓氏排序。为什么?因为 LDAP 的工作方式与 RDBMS 不同;您无法对任意字段进行结果集排序,无论您是否“选择”了它。您必须始终将要对条目进行排序的属性包含在请求的属性中(在本例中,将 'sn' 添加到 $ldap_attributes 中)。

希望这对其他在尝试对条目进行排序时一头雾水的人有所帮助...
thorben at kapp-hamburg dot de
13 年前
我想知道如何按 dn 排序,只是为了显示树形视图。我尝试设置 $sortfilter = 'dn',但这不起作用。然后我尝试使用空字符串 ''。这有效,条目按 dn 排序。
ben at xsusio dot com
19 年前
如果您想按多个属性排序,例如按姓氏排序,然后按名字排序,请尝试使用此函数。这类似于 SQL 中的“ORDER BY lastname, firstname”。

此函数使用插入排序算法,它比老式的冒泡排序快一些。第二个参数是一个数组,包含您要排序的属性。(此函数不会执行降序或升序排序......您可以随意添加它!)

<?php
/**
* @param array $entries
* @param array $attribs
* @desc 按多个属性对 LDAP 结果条目进行排序。
*/
function ldap_multi_sort(&$entries, $attribs){
for (
$i=1; $i<$entries['count']; $i++){
$index = $entries[$i];
$j=$i;
do {
// 从属性创建比较变量:
$a = $b = null;
foreach(
$attribs as $attrib){
$a .= $entries[$j-1][$attrib][0];
$b .= $index[$attrib][0];
}
// 进行比较
if ($a > $b){
$is_greater = true;
$entries[$j] = $entries[$j-1];
$j = $j-1;
}else{
$is_greater = false;
}
} while (
$j>0 && $is_greater);

$entries[$j] = $index;
}
return
$entries;
}
?>
askgopal at sify dot com
20 年前
这是我编写的一个简单的 LDAP 排序函数

<?php
function sort_ldap_entries($e, $fld, $order)
{
for (
$i = 0; $i < $e['count']; $i++) {
for (
$j = $i; $j < $e['count']; $j++) {
$d = strcasecmp($e[$i][$fld][0], $e[$j][$fld][0]);
switch (
$order) {
case
'A':
if (
$d > 0)
swap($e, $i, $j);
break;
case
'D':
if (
$d < 0)
swap($e, $i, $j);
break;
}
}
}
return (
$e);
}

function
swap(&$ary, $i, $j)
{
$temp = $ary[$i];
$ary[$i] = $ary[$j];
$ary[$j] = $temp;
}
?>

所以它可以像这样调用

<?php
$entries
= sort_ldap_entries($entries, 'mail', 'A'); // 按邮件升序排序条目
?>

其中,
`$entries` 是由 ldap_get_entries() 函数返回的数组。

这对那些仍在其 Web 服务器上运行旧版 PHP(<= 4.2.0)的用户可能很有用 :-)
matthew dot j dot gray at uwrf dot edu
22 年前
此函数将 strcmp() 应用于每个属性(由 sortfilter 给出),以便对服务器返回的条目进行排序。要按姓氏升序排列搜索结果,请尝试将“sn”作为 sortfilter 参数传递。此函数不能很好地处理多值属性。
jason dot sokolowski at rotork dot com
21 年前
我写的一个非常简单的程序,用于按人员姓氏对目录搜索进行排序。

<?php
for($i=0;$i<$result["count"];$i++)
{

$lastname = $result[$i]["sn"][0];

$lnames["$i"]=$lastname;

}
//for i

@asort($lnames);
?>
fbernardi at bbros dot it
8 年前
为了按多个字段排序,您可以对数组进行多次排序
例如

ldap_sort($link, $result, 'givenname');
ldap_sort($link, $result, 'sn');
To Top