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