如何迭代嵌套数组?

Posted

技术标签:

【中文标题】如何迭代嵌套数组?【英文标题】:How to iterate over nested arrays? 【发布时间】:2015-10-17 01:39:27 【问题描述】:

这是我所拥有的:

$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 语句以添加&lt;ul&gt;&lt;/ul&gt; 标记...

我开始看到星星……太混乱了。

【问题讨论】:

“家”在哪里适合您的输出? @RobertCathey 对不起!这只是我在实际页面上工作的困惑。 > > 删除它。 我几乎拥有它。只是遇到了一个奇怪的问题。 知道了。将完全递归地工作。 向所有人致敬!经过测试,它们都有效。只选择了编码最短且最容易阅读的那个...@@;; 【参考方案1】:

试试看:)

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);

【讨论】:

【参考方案2】:

试试

<?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>";
?>

【讨论】:

【参考方案3】:
$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>

【讨论】:

以上是关于如何迭代嵌套数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何迭代sqlite中嵌套json对象中的数组?

如何让两个嵌套的 Parfors 在 Matlab 中迭代两个巨大的数组?

如何在 REACT JS API 调用中迭代 JSON 嵌套数组?

如何在嵌套数组(数组中的数组)上使用 v-for 指令进行迭代

如何迭代嵌套的 JSON 对象 [重复]

如何使用迭代器嵌套循环?