0

I'm trying to create nested unordered list with php loops. I've tried different things but I need your help to improve my code. Let say in this example that I want four levels.

Here is my PHP code :

<ul>
<?php
for($i = 0; $i < 1; $i++): ?>
<li>
    <ul>
    <?php for($j = 0; $j <2; $j++): ?>
        <li>
            <ul>
                <?php for($k = 0; $k <2; $k++): ?>
                <li>
                    <ul>
                        <?php for($l = 0; $l <2; $l++): ?>
                        <li></li>
                        <?php endfor; ?>
                    </ul>
                </li>
                <?php endfor; ?>
            </ul>
        </li>
    <?php endfor; ?>
    </ul>
</li>
<?php
endfor;
?>
</ul>

Here is my HTML output :

<ul>
<li>
    <ul>
        <li>
            <ul>
                <li>
                    <ul>
                        <li></li>
                        <li></li>
                    </ul>
                </li>
                <li>
                    <ul>
                        <li></li>
                        <li></li>
                    </ul>
                </li>
            </ul>
        </li>
        <li>
            <ul>
                <li>
                    <ul>
                        <li></li>
                        <li></li>
                    </ul>
                </li>
                <li>
                    <ul>
                        <li></li>
                        <li></li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</li>
</ul>

Is there a smarter way to do so? I hope so. I would like to know because I aim to define number of levels dynamically and what I've done is not dynamic at all! :)

Thanks a lot for your replies!

7
  • 2
    Recursive functions? Commented Feb 28, 2013 at 18:02
  • 2
    Start by constructing an array that represents the content you want to put into these elements. Commented Feb 28, 2013 at 18:03
  • @Jon What for? This is not about content but about structure only. I just want to get that kind of structure but I would like to make the number of levels dynamic. Commented Feb 28, 2013 at 18:13
  • @Shef Probably but I don't see how! Commented Feb 28, 2013 at 18:13
  • @romainbriand Jon gave you a wise advise. Construct a sample array with real/dummy data so you can see a solution out of it. Let me see if I can help you out with an answer. Commented Feb 28, 2013 at 18:16

1 Answer 1

1

You can use recursive functions if you have the array in a certain format.

1. Example array

$arr = array(
    'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
    'Aenean id erat et justo eleifend dapibus iaculis non diam.',
    array(
        'Donec viverra mauris sit amet nulla semper sit amet venenatis urna elementum.',
        'Aliquam bibendum arcu metus, vitae pellentesque felis.',
        'Etiam eu erat est, sit amet mollis justo.',
        array(
            'Cras luctus nulla vitae turpis bibendum rutrum.',
            'Donec vel sem mi, eu viverra magna.',
            'Aliquam non leo vitae turpis commodo malesuada.',
            'Suspendisse congue nulla nec justo molestie convallis sodales dolor tincidunt.',
            array(
                'Etiam blandit dictum metus, eget ullamcorper odio commodo eu.',
                'Integer congue eros a mauris feugiat volutpat.',
                'Sed nec diam sem, ac sollicitudin libero.',
                'Phasellus vulputate tincidunt risus, vitae convallis nisi feugiat id.',
                'Donec vehicula lobortis magna, sed euismod massa tristique sed.',
            ),
        ),
        'Fusce vel sem sem, non volutpat nisi.',
        'Pellentesque molestie ipsum vitae orci sodales iaculis.',
    ),
);

2. The recursive function

function list_it($data_array, $list_tag = 'ul') {
    // enforce valid list tag
    if ($list_tag != 'ul' && $list_tag != 'ol')
        $list_tag = 'ul';

    // we need an array with data
    if (!is_array($data_array) || empty($data_array))
        return;
    echo '<',$list_tag,'>';

    foreach ($data_array as $element) {
        if (is_array($element)) {
            list_it($element);
        }
        else {
            echo '<li>',$element,'</li>';
        }
    }
    echo '</',$list_tag,'>';
}

list_it($arr, 'ul');

3. Output (HTML indentation added by me, not the function)

<ul>
    <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
    <li>Aenean id erat et justo eleifend dapibus iaculis non diam.</li>
    <ul>
        <li>Donec viverra mauris sit amet nulla semper sit amet venenatis urna elementum.</li>
        <li>Aliquam bibendum arcu metus, vitae pellentesque felis.</li>
        <li>Etiam eu erat est, sit amet mollis justo.</li>
        <ul>
            <li>Cras luctus nulla vitae turpis bibendum rutrum.</li>
            <li>Donec vel sem mi, eu viverra magna.</li>
            <li>Aliquam non leo vitae turpis commodo malesuada.</li>
            <li>Suspendisse congue nulla nec justo molestie convallis sodales dolor tincidunt.</li>
            <ul>
                <li>Etiam blandit dictum metus, eget ullamcorper odio commodo eu.</li>
                <li>Integer congue eros a mauris feugiat volutpat.</li>
                <li>Sed nec diam sem, ac sollicitudin libero.</li>
                <li>Phasellus vulputate tincidunt risus, vitae convallis nisi feugiat id.</li>
                <li>Donec vehicula lobortis magna, sed euismod massa tristique sed.</li>
            </ul>
        </ul>
        <li>Fusce vel sem sem, non volutpat nisi.</li>
        <li>Pellentesque molestie ipsum vitae orci sodales iaculis.</li>
    </ul>
</ul>
Sign up to request clarification or add additional context in comments.

1 Comment

Awesome! Therefore I understand the need of having an array :) Thank you very much!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.