2017-10-02 9 views
3

Ich erstelle eine LDAP-Verzeichnissuche mit PHP.Wie LDAP-Ergebnis mit LDAP-Filter sortieren?

Ich kann erfolgreich suchen und Ergebnisse zurückgeben.

Ich möchte Ergebnisse nach Hierarchie sortieren können. Jetzt habe ich:

ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
ou=IT,ou=Employees,ou=People,dc=instatsport,dc=com 
ou=Video,ou=Employees,ou=People,dc=instatsport,dc=com 
ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
ou=aHR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
ou=HR2,ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 

Mit php.net/manual/en/function.ldap-sort.php welche Filter sollte dieses Ergebnis ?:

ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
ou=HR2,ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
ou=aHR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
ou=IT,ou=Employees,ou=People,dc=instatsport,dc=com 
ou=Video,ou=Employees,ou=People,dc=instatsport,dc=com 

Antwort

0

Sie können nicht mit ldap_sort bekommen angewendet werden.

Mit dieser Funktion wird ein strcmp auf ein Attribut der zurückgegebenen Einträge angewendet.

Hier versuchen Sie, die DN der zurückgegebenen Einträge zu bestellen, und zwar nicht auf alphabetischer, sondern auf hierarchischer Ebene.

Sie müssen dies implementieren (oder jemanden finden, der dies bereits getan hat).

Die einfachste Implementierung wäre, einen Baum mit dem gesamten RDN zu erstellen und diesen Baum von Stamm zu Block zu drucken, wobei jeder RDN rekursiv mit einem Komma implodiert wird.

EDIT:

Ich brauchte einige Zeit, um zu versuchen, es schnell zu implementieren, ist dies nicht der beste Code Sie finden können, aber es kann ba eine Basis für das, was Sie erreichen wollen:

function hierarchySort ($a, $b){ 
     $rdn1 = ldap_explode_dn($a,0); 
     $rdn2 = ldap_explode_dn($b,0); 

     $count = $rdn1["count"] < $rdn2["count"] ? $rdn1["count"] : $rdn2["count"]; 

     for ($i=0; $i<$count; $i++) { 
       $j1 = $rdn1["count"] - 1 - $i; 
       $j2 = $rdn2["count"] - 1 - $i; 
       $ret = strnatcasecmp($rdn1[$j1], $rdn2[$j2]); 
       if ($ret != 0) break; 
     } 

     if ($rdn1["count"] == $rdn2["count"]) { 
       return $ret; 
     }else { 
       if ($ret != 0) return $ret; 
       else return $rdn1["count"] < $rdn2["count"] ? -1 : 1; 
     } 
} 

// Some simulated LDAP result 
$entries = [ 
     0 => [ "dn" => "ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com" ], 
     1 => [ "dn" => "ou=IT,ou=Employees,ou=People,dc=instatsport,dc=com" ], 
     2 => [ "dn" => "ou=Video,ou=Employees,ou=People,dc=instatsport,dc=com" ], 
     3 => [ "dn" => "ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com" ], 
     4 => [ "dn" => "ou=aHR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com" ], 
     5 => [ "dn" => "ou=HR2,ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com" ], 
     "count" => 6 
]; 

for ($i=0; $i<$entries['count']; $i++) { 
     $e = $entries[$i]; 
     $dns[] = $e["dn"]; 
} 

print_r($dns); 
usort($dns, 'hierarchySort'); 
print_r($dns); 

Ouput:

Array 
(
    [0] => ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
    [1] => ou=IT,ou=Employees,ou=People,dc=instatsport,dc=com 
    [2] => ou=Video,ou=Employees,ou=People,dc=instatsport,dc=com 
    [3] => ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
    [4] => ou=aHR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
    [5] => ou=HR2,ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
) 
Array 
(
    [0] => ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
    [1] => ou=aHR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
    [2] => ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
    [3] => ou=HR2,ou=HR1,ou=HR,ou=Employees,ou=People,dc=instatsport,dc=com 
    [4] => ou=IT,ou=Employees,ou=People,dc=instatsport,dc=com 
    [5] => ou=Video,ou=Employees,ou=People,dc=instatsport,dc=com 
) 
0

ldap_sort wird mittlerweile als veraltet, da es nur die Ergebnismenge vom Server zurück sortiert. Für kleine Ergebnismengen, die kein Problem darstellen, aber für größere (seitenweise) Ergebnismengen bedeutet dies, dass Sie Ergebnisse von "a" bis "z" auf der ersten Seite erhalten, die dann sortiert werden. Und auf der zweiten Seite erhalten Sie auch Ergebnisse von "a" bis "z", die dann sortiert werden und so weiter. Daher ist die Sorte nicht wirklich das, was die meisten Leute erwarten.

Auch ldap_sort kann nur nach Feldern sortieren, die tatsächlich abgerufen wurden. Sie können also nicht nur den "Vornamen" abrufen und nach "Zweitnamen" sortieren.

Um Ihre Frage zu beantworten: Ich würde eine Sortierfunktion wie folgt schreiben und das mit f.e. usort:

function sortByDn($a, $b) { 
    return strnatcasecmp($a['dn'], $b['dn']); 
} 


$result = ldap_get_Entries($handle, $resulthandle); 
unset($result['count']); 
usort($result, 'sortByDn'); 

Etwas in diese Richtung tatsächlich helfen könnte;)

Je nachdem, was Sie von Ihrer Sortierfunktion sortieren möchten könnte anders sein muß!

+0

Ich denke, die PHP-Funktion, die Sie beziehen, ist: http://php.net/manual/en/function.strnatcmp.php. Auch die hierarchische Sortierung, nach der er fragt, ist nicht nur mit alphabetischer Reihenfolge möglich, da ein DN wie ou = HR, ou = Mitarbeiter, ou = Personen, dc = instatsport, dc = com vor DN wie ou = aHR1 stehen sollte , ou = HR, ou = Angestellte, ou = Leute, dc = instatsport, dc = com. Er muss einen Baum erstellen und hierarchisch drucken – Esteban

+0

Danke für den Hinweis. Ich meinte strnatcasecmp. Die Antwort entsprechend angepasst.Und Sie haben Recht, dass die Sortierung nach dem Baum durch die Funktion, die ich geschrieben habe, nicht erreicht werden kann. Aber darum geht es im letzten Satz;) – heiglandreas