如何迭代嵌套数组?

4

以下是我拥有的内容:

$nav = array (
    "page 1" => array (
        "page 1.1" => array (
            "page 1.1.1"
            "page 1.1.2"
        ) ,
        "page 1.2"
    )
    "page 2" => array (
        "page 2.1"
    )
);

以下是我想要的内容:

<nav>
    <ul>
        <li>page 1
            <ul>
                <li>page 1.1
                    <ul>
                        <li>page 1.1.1</li>
                        <li>page 1.1.2</li>
                    </ul>
                </li>
                <li>page 1.2</li>
            </ul>
        </li>
        <li>page 2
            <ul>
                <li>page 2.1</li>
            </ul>
        </li>
    </ul>
</nav>

我目前所拥有的内容:

foreach ($nav as $key => $val) {
    if (!is_numeric($key)) {
        $nav_entry = $key;
    } else {
        $nav_entry = $val;
    }
    echo "<li>" . $nav_entry . "</li>";
}

我的问题在于,如果有子数组,我需要使用foreach循环。此外,我需要添加一个if语句来插入

    标签...

    我开始感到困惑了。


    “home” 在你的输出中有何作用? - backend_dev_123
    @RobertCathey 对不起!那只是我在处理真实页面时的混淆。> > 我会将其删除。 - reanseih
    我差不多有了。只是遇到了一个奇怪的问题。 - backend_dev_123
    明白了。将完全使用递归来实现。 - backend_dev_123
    1
    感谢大家!测试过了,它们都可以工作。只需选择最短且易于阅读的代码...@@;; - reanseih
    3个回答

    2
    尝试一下 :)
    function createMenu($nav){
        echo "<ul>";
        foreach($nav as $key => $row){
            if(!is_array($row)){
                echo "<li>".$row."</li>";
            }else{
                echo "<li>".$key;
                    createMenu($row);
                echo "</li>";
    
            }
        }
        echo "</ul>";
    }
    
    createMenu($nav);
    

    1
    $array = [
        'home',
        'page 1' => [
            'page 1.1' => [
                'page 1.1.1',
                'page 1.1.2'
            ],
            'page 1.2'
        ],
        'page 2' => [
            'page 2.1'
        ]
    ];
    
    function buildLists($array) {
        $result = '';
        foreach($array as $key => $value) {
            if(!is_int($key)) {
                $result .= '<li>' . $key;
            } else if(!is_array($value)) {
                $result .= '<li>' . $value;
            }
            if(is_array($value)) {
                $result .= '<ul>';
                $result .= buildLists($value);
                $result .= '</ul>';
            } else {
                $result .= '</li>';
            }
        }
        return $result;
    }
    

    使用方法:

    <nav>
       <ul>
           <?= buildLists($array); ?>
       </ul>
    </nav>
    

    输出:

    <li>home</li>
    <li>page 1
        <ul>
            <li>page 1.1
                <ul>
                    <li>page 1.1.1</li>
                    <li>page 1.1.2</li>
                </ul>
            </li>
            <li>page 1.2</li>
        </ul>
    </li>
    <li>page 2
        <ul>
            <li>page 2.1</li>
        </ul>
    </li>
    

    1

    尝试

    <?php
    $nav = array (
        "page 1" => array (
            "page 1.1" => array (
                "page 1.1.1",
                "page 1.1.2"
            ),
            "page 1.2"
        ),
        "page 2" => array (
            "page 2.1"
        )
    );
    
    function drawRecursive($list){
        echo "<ul>";
        foreach ($list as $key=>$item){
            echo "<li>";
            if (is_array($item)){
                echo $key;
                drawRecursive($item);
            } else {
                echo $item;
            }
            echo "</li>";
        }
        echo "</ul>";
    }
    
    echo "<nav>";
    drawRecursive($nav);
    echo "</nav>";
    ?>
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接