0

我正在尝试从这样的数组创建一棵树:

array('admin/home', 'admin/home/page', 'admin/test', 'team/tree/template', 'site');

或者更直观地视为:

管理员/主页

管理员/主页/页面

管理/测试

团队/树/模板

地点

但是,我还需要将每个数组的最后一个嵌套字符串变为粗体,以表示它本身就是一个网页。

最终产品应如下所示:

    管理员
        主页
            测试_
        
    团队
        树
            模板
    网站

我使用了该站点上的一些不同解决方案,但未能获得正确的结果。

任何关于我应该从哪里开始的想法或例子将不胜感激,谢谢。

4

1 回答 1

1

您可能正在寻找这样的东西:

<?php

$items = array('admin/home', 'admin/home/page', 'admin/test', 'site', 'team/tree/template');
sort($items);

$previous = array();
foreach ($items as $item) {
    $path = explode('/', $item);

    // $i is common nesting level of the previous item
    // e.g. 0 is nothing in common, 1 is one level in common, etc.
    for ($i = 0; $i < min(count($path), count($previous)) && ($path[$i] == $previous[$i]); $i++) { }

    // close <ul> from previous nesting levels:
    // that is, we close the amount of levels that the previous and this one have NOT in common
    for ($k = 0; $k < count($previous)-$i-1; $k++) { echo "</ul>"; }
    // $j is the current nesting level
    // we start at the common nesting level
    for ($j = $i; $j < count($path); $j++) {
        // open <ul> for new nesting levels:
        // i.e., we open a level for every level deeper than the previous level
        if ($j >= count($previous))
            echo "<ul>";
        echo "<li>";
        // make the path bold if the end of the current path is reached
        if (count($path)-1 == $j)
            echo "<b>" . $path[$j] . "</b>";
        else
            echo $path[$j];
        echo "</li>";
    }
    $previous = $path;
}
// close remaining <ul>
for ($k = 0; $k < count($previous); $k++) { echo "</ul>"; }
?>

请注意,我对数组进行排序以确保所有嵌套项彼此相邻。

它可能有一些错误,但我想你可以自己解决它们。请注意,我在打开嵌套的<ul>. 这不是应该的。我猜你实际上应该在那个级别打开嵌套<ul>在决赛<li>中,但你可以自己弄清楚。

更新<ul>我更新了代码以在某些情况下正确关闭's。

于 2012-06-03T19:17:19.837 回答