PHP Conference Japan 2024

ldap_sort

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

ldap_sort在用戶端排序 LDAP 結果項目

警告

此函式自 PHP 7.0.0 起已被標記為 *已棄用*,並自 PHP 8.0.0 起已被 *移除*。強烈建議不要依賴此函式。

說明

ldap_sort(資源 $link, 資源 $result, 字串 $sortfilter): 布林值

排序由 ldap_search() 返回的 LDAP 搜尋結果。

由於此函數在客戶端對返回的值進行排序,因此如果達到伺服器的 `sizelimit` 或在 ldap_search() 中定義的 `sizelimit`,則可能無法獲得預期的結果。

參數

link

ldap_connect() 返回的 LDAP 資源。

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);

新增註解

使用者貢獻的註解 6 則註解

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 的運作方式不像關聯式資料庫;您無法根據任意欄位排序結果集,無論您是否「選取」了它。您必須一律將要用於排序項目的屬性包含在請求的屬性中(在這種情況下,將 'sn' 添加到 $ldap_attributes 中)。

希望這對其他在嘗試排序項目時遇到問題的人有所幫助...
thorben at kapp-hamburg dot de
13 年前
我想知道如何按照 dn 排序,以便顯示樹狀檢視。我嘗試設定 $sortfilter = 'dn',但沒有成功。然後我嘗試使用空字串 ''。這樣就成功了,項目按 dn 排序。
ben at xsusio dot com
20 年前
如果您想要根據多個屬性排序,例如先按姓氏排序,然後按名字排序,請嘗試使用這個函式。這類似於 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
21 年前
這是我寫的一個簡單的 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'); // 以 mail 的升冪排序 entries
?>
其中:
`$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
22 年前
這是我寫的一個非常簡單的程式碼,用於按姓氏排序目錄搜尋結果。

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

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

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

}
//for i

@asort($lnames);
?>
To Top