Php: генерировать дерево ul-li из результатов активного каталога - PullRequest
0 голосов
/ 18 сентября 2009

У меня есть набор результатов из adLDAP в форме

OU=LEAF1,OU=PARENT1,OU=ROOT,DC=datacenter,DC=local
OU=PARENT1,OU=ROOT,DC=datacenter,DC=local
OU=ROOT,DC=datacenter,DC=local
OU=LEAF2,OU=CHILD,OU=PARENT2,OU=ROOT,DC=datacenter,DC=local
OU=CHILD,OU=PARENT2,OU=ROOT,DC=datacenter,DC=local
OU=PARENT2,OU=ROOT,DC=datacenter,DC=local

Где каждая строка является строковым элементом в массиве. Представленная древовидная структура:

Root
  |--Parent1
       |--Leaf1
  |--Parent2
       |--Child
            |--Leaf2

и я хочу создать это

<ul>
<li>root
    <ul>
        <li>Parent1
            <ul>
                <li>leaf1</li>
            </ul>
        </li>
        <li>Parent2
            <ul>
                <li>Child
                    <ul>
                        <li>Leaf2</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</li>
<li>

</ul>

Я знаю, что мне нужно обработать строки назад, и я знаю, что решение рекурсивное, но сегодня пятница, прошло много времени с тех пор, как я это сделал, и мой мозг застрял.

1 Ответ

2 голосов
/ 18 сентября 2009

Вот моя попытка:

<?php 
$lines = array(
    'OU=LEAF1,OU=PARENT1,OU=ROOT,DC=datacenter,DC=local',
    'OU=PARENT1,OU=ROOT,DC=datacenter,DC=local',
    'OU=ROOT,DC=datacenter,DC=local',
    'OU=LEAF2,OU=CHILD,OU=PARENT2,OU=ROOT,DC=datacenter,DC=local',
    'OU=CHILD,OU=PARENT2,OU=ROOT,DC=datacenter,DC=local',
    'OU=PARENT2,OU=ROOT,DC=datacenter,DC=local',
);

//build tree structure
$tree = array();

foreach ($lines as $line) {
    $ancestry = getLineAncestry($line);

    $node = & $tree;

    foreach ($ancestry as $nodeName) {
        if (! isset($node[$nodeName])) {
            $node[$nodeName] = array();
        }

        $node = & $node[$nodeName];
    }
}


print makeUl($tree);

//recurse through tree to build unordered-list
function makeUl($array) {
    $result = '<ul>';
    foreach ($array as $nodeName => $children) {
        $result .= '<li>' . ucfirst($nodeName);
        if (count($children)) {
            $result .= makeUl($children);
        }
        $result .= '</li>';
    }   
    $result .= '</ul>';
    return $result;
}


function getLineAncestry($line) {
    $result = array();
    $params = explode(',', $line);
    foreach ($params as $param) {
        $tmp = explode('=', $param);
        if ($tmp[0] == 'OU') {
            $result[] = $tmp[1];
        }
    } 
    $result = array_reverse($result);  
    return $result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...