PHP从3d数组制作HTML列表?

时间:2017-12-22 12:01:55

标签: php foreach html-lists

我正在尝试从3d数组中创建一个html列表:

<?php
$items = [
    0 => [
        'id' => 100,
        'parent_id' => 0,
        'url' => 'Home',
        'children' => []
    ],

    1 => [
        'id' => 101,
        'parent_id' => 0,
        'url' => 'About',
        'children' => [
            0 => [
                'id' => 102,
                'parent_id' => 101,
                'url' => 'About 1'
            ],

            1 => [
                'id' => 102,
                'parent_id' => 101,
                'url' => 'About 2'
            ],

            2 => [
                'id' => 102,
                'parent_id' => 101,
                'url' => 'About 3'
            ],
        ]
    ],

];

?>

<?php if (count($items) > 0) { ?>
<ul>

    <?php foreach ($items as $item) { ?>
    <li><?php echo $item['url'];?>

        <?php if(count($item['children']) > 0) { ?>
            <ul class="nested">
                <?php foreach ($item['children'] as $subitem) { ?>
                    <li><?php echo $subitem['url'];?></li>
                <?php } ?>
            </ul>
        <?php } ?>

    </li>
    <?php } ?>

</ul>
<?php } ?>

结果:

<ul>
    <li>Home</li>
    <li>About
        <ul class="nested">
            <li>About 1</li>
            <li>About 2</li>
            <li>About 3</li>
        </ul>
    </li>
</ul>

但我追求的是:

<ul>
    <li>Home</li>
    <li>About
        <ul class="nested">
            <li>About 1</li>
        </ul>
        <ul class="nested">
            <li>About 2</li>
        </ul>
        <ul class="nested">
            <li>About 3</li>
        </ul>
    </li>
</ul>

有什么想法吗?

数组结构应该如何实现我想要的HTML列表?

1 个答案:

答案 0 :(得分:2)

如何用这样的东西添加一些递归?无论尺寸有多深(3D,4D等),它都会照顾您的清单。

function create_list($items) {
    if (count($items)==0) return null; // if your child item is empty

    if (!array_key_exists('children', $items) || count($items['children'])==0) {
        echo '<li>'.$items['url'].'</li>';
        return null;
    }

    // just to be sure we have the index 'url'
    if (array_key_exists('url', $items)) {
        echo '<li>'.$items['url'].'</li>';
    }       

    foreach($items['children'] as $child) {
        echo "<ul class='nested'>";
        create_list($child);        
        echo "</ul>";
    }
}

echo "<ul>";
foreach($items as $item) {
    create_list($item);
}
echo "</ul>";