【问题标题】:How to form a PHP tree menu? [closed]如何形成一个PHP树形菜单? [关闭]
【发布时间】:2012-01-06 23:21:16
【问题描述】:

我的数据库中存储了一些路径:它们未排序,可以是任意长度。

--------路径--------

C:/devices/data1

C:/devices/data1/application2

C:/devices/data1/application1

C:/devices/data2/application3

C:/devices/data2/application2

C:/devices/data2/application1

C:/devices/data1/application3

我需要形成如下菜单:

C > devices > data1> application1 
                     application2 
                     application3 
              data2> application1 
                     application2 
                     application3 

你能帮我解决这个问题吗?

希望得到一些快速响应。谢谢!

Ulvund 的解决方案对我有用,但现在我需要生成指向 href 标记的链接:

我尝试了以下方法:

http://www.pbalan01.0fees.net/god1.php

请帮我删除多余的节点:它当前生成...

C:/设备/数据1 数据1/应用程序1 应用2 应用3 数据2 数据2/应用程序1 应用2 应用3

【问题讨论】:

  • 是否可以选择更改数据库结构?
  • Yo Prashant 我编辑了我的解决方案以反映您对菜单样式的希望(查看底部)
  • teresko,我不认为改变数据库是一种选择。现在我对 Ulvund 的解决方案很满意,但唯一的事情是我需要为 标签生成链接

标签: php database menu path tree


【解决方案1】:
$paths[] = "C:/devices/data1";
$paths[] = "C:/devices/data1/application2";
$paths[] = "C:/devices/data1/application1";
$paths[] = "C:/devices/data2/application3";
$paths[] = "C:/devices/data2/application2";
$paths[] = "C:/devices/data2/application1";
$paths[] = "C:/devices/data1/application3";


function to_tree(&$multifruit, $fruit) {
    if (count($fruit)>2) {
        $shifted = array_shift($fruit);
        to_tree($multifruit[$shifted], $fruit);
        return $multifruit;
    } else {
        return $multifruit[$fruit[0]][] = $fruit[1];
    }   
}   

sort($paths);
foreach($paths as $path) {
   $path = explode("/",$path);
   to_tree($multifruit, $path);
}   

print_r($multifruit);
/* Result
Array
(
    [C:] => Array
        (
            [devices] => Array
                (
                    [0] => data1
                    [data1] => Array
                        (
                            [0] => application1
                            [1] => application2
                            [2] => application3
                        )

                    [data2] => Array
                        (
                            [0] => application1
                            [1] => application2
                            [2] => application3
                        )

                )

        )

)


*/

编辑

要获得您想要的完整结果(或在我的帮助下获得的最接近的结果):使用以下代码:http://hpaste.org/54546

http://redditlist.com/test2.php上查看示例

编辑 3

http://redditlist.com/test3.php

http://hpaste.org/54599

【讨论】:

  • 您好 Ulvund,非常感谢您的早日回复。你能告诉我这个函数的逻辑吗?我完全迷失了这个问题。如果您能告诉我它是如何执行排序的,我将不胜感激?
  • 排序:只需添加 ksort($paths); 就像我在编辑中所做的那样 :-)
  • 非常感谢。我想进一步问一个问题:我需要在这里打印每个级别:pbalan01.0fees.net/test2.html 你能告诉我如何实现这一目标吗?
  • 嗨,Ulvund,我认为您的解决方案仅适用于在数组中按长度排序的路径...... ???
  • ksort($paths) 无效,您必须使用 sort() 因为您正在排序值而不是数组的键...
【解决方案2】:

代码

<?php

$rows = array(
    'C:/devices/data1',
    'C:/devices/data1/application2',
    'C:/devices/data1/application1',
    'C:/devices/data2/application3',
    'C:/devices/data2/application2',
    'C:/devices/data2/application1',
    'C:/devices/data1/application3',
);
sort($rows);

$sorted = array();
foreach ($rows as $row) {
    eval('$sorted["' . implode('"]["', explode('/', $row)) . '"] = array();');
}
print_r($sorted);

?>

输出

Array
(
    [C:] => Array
        (
            [devices] => Array
                (
                    [data1] => Array
                        (
                            [application1] => Array
                                (
                                )
                            [application2] => Array
                                (
                                )
                            [application3] => Array
                                (
                                )
                        )
                    [data2] => Array
                        (
                            [application1] => Array
                                (
                                )
                            [application2] => Array
                                (
                                )
                            [application3] => Array
                                (
                                )
                        )
                )
        )
)

【讨论】:

  • Glavic,完美的解决方案...我是 PHP 新手,很高兴知道解决方案的逻辑。
  • Galvic 用 mysql 排序数据,如何?如果您可以建议任何数据库查询。
  • 嗨 Glavic,非常感谢。我想进一步问一个问题:我需要在这里打印每个级别:pbalan01.0fees.net/test2.html 你能告诉我如何实现这一目标吗?
  • 嗨 Galvic,我认为您的解决方案仅适用于在数组中按长度排序的路径... ???当我将路径更改为不同的值时,我遇到了一些问题..
  • 没错,如果您有未排序的路径,那就不行了。我用简单的 if 编辑并修复了它。它现在应该可以工作了。同样:如果您从数据库中选择数据,则不需要排序。您甚至可以在调用我的循环之前对路径数组进行排序,轻松修复。如果您修复,该数据库结果将被排序,然后您可以在 foreach 循环中删除 2 行(它可以只有一个)...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多