【问题标题】:How to generate menu from dynamic multidimensional array [closed]如何从动态多维数组生成菜单 [关闭]
【发布时间】:2015-06-30 08:22:24
【问题描述】:

假设我在这里有数组。我遗漏了一些地图和文件,因为这足以说明我的观点。数组没有最大深度,所以可以有更多。

Array
(
    [media] => Array
        (
            [documents] => Array
                (
                    [0] => add.php
                )    
            [music] => Array
                (
                    [albums] => Array
                        (
                            [0] => add.php
                        )    
        )    
    [overview] => Array
        (
            [0] => overview.php
        )
) 

我想得到如下内容:

<ul>
    <li>Media
        <ul>
            <li>Documents
                <ul>
                    <li><a href="/media/documents/add.php">Add</a></li>
                </ul>
            </li>

            <li>Music
                <ul>
                    <li>Albums
                        <ul>
                            <li><a href="/media/music/albums/add.php">Add</a></li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </li>

    </li>Overview
        <ul>
            <li><a href="/overview/overview.php">Overview</a></li>
        </ul>
    </li>
</ul>

我找到了php create navigation menu from multidimensional array dynamically,但 imo 接受的答案有很多垃圾,结果并不完全符合我的需要。如果您想知道数组是如何生成的,请告诉我。

提前感谢您帮助我

【问题讨论】:

  • 你试过什么?如果您显示您的代码,那么人们将能够给您一些指示。如果您从头开始,我建议使用递归函数来处理您的数组可能具有的复杂性。
  • @GeoffAtkins 因为你可能有红色我尝试了链接问题的答案。而且我不想每次尝试都把问题弄得一团糟。
  • 在另一个线程中有不止一个答案......在所有这些答案之间,您应该能够根据您的特定情况进行调整。您需要我们为您编写您的应用程序吗?或者您有什么具体的详细问题需要帮助?

标签: php arrays multidimensional-array


【解决方案1】:

您需要使用循环遍历数组的递归函数。像这样的:

function outputMenu(array $array, $baseUrl = '/')
{
    $html = '';
    foreach ($array as $key => $item)
    {
        if (is_array($item))
        {
            $html .= '<li>'.$key.'<ul>';
            $html .= outputMenu($item, $baseUrl.$key.'/');
            $html .= '</ul></li>';
        }
        else
        {
            $html .= '<li><a href="'.$baseUrl.$item.'">'.ucfirst(substr($item, 0, -4)).'</a></li>';
        }
    }
    return $html;
}

echo outputMenu($array);

【讨论】:

  • 感谢我所需要的,没有垃圾。还学习了一个新功能ucfirst()
【解决方案2】:
$array = array(
    'media'=>array('documents'=>array('add.php'),
                    'music'=>array('albums'=>array('add.php'))),
    'overview'=>array('overview.php')
);
print_link($array);
function print_link($arre){
    foreach($arre as $key => $arr){
        if(is_array($arr)){
        echo '<li>'. $key .'<ul>';
            print_link($arr);//echo '<li>'.$arr.'</li>';
        echo '</ul><li>';

        } else {
            echo '<li>'.$arr.'</li>';           
        }

    }

}

你需要一个函数来完成这个任务

【讨论】:

  • 使用过程代码,必须在调用之前定义函数。你为什么加这个?在我的回答之后并没有添加任何内容,实际上它比我的回答更糟糕......
  • 在准备答案时,您应该告诉人们不要提供帮助 :) 无论如何它对我来说就像一个魅力......