1

I have a nested array, and am looking to turn it into an unordered list:

[2009] => Array
    (
        [Show Name 1] => Array
            (
                [0] => Class 1
                [1] => Class 2
            )

    )

[2008] => Array
    (
        [Show Name 2] => Array
            (
                [0] => Class 1
                [1] => Class 2
            )

    )

And turn that into:

2009
    Show Name 1
        Class 1
        Class 2
2008
    Show Name 2
        Class 1
        Class 2

So far I have partially managed it, by being able to show the Year, but after that I get 'array' where the show name should be:

2012
    Array
    Array
2009
    Array
2008
    Array

I made that using the following:

    <ul>
    <?php foreach( $results as $year => $shows ): ?>
    <li><?= $year ?>
      <ul>
        <?php foreach( $shows as $show ): ?>
        <li><?= $show ?></li>
        <?php endforeach; ?>
      </ul>
    </li>
    <?php endforeach; ?>
</ul>

Update

I need to grab the YEAR_ID, SHOW_ID, CLASS_ID for each result, so that I can pass them into a URL. Something like:

        <ul class="no-bullet">
        <?php foreach( $results as $year => $shows ): ?>
        <li><h2><?= $year ?></h2>
          <ul class="no-bullet">
            <?php foreach( $shows as $show_name => $show ): ?>
            <li><h4><?= $show_name ?></h4></li>
                 <ul class="no-bullet">
                      <?php foreach( $show as $class ): ?>
                      <li><a href="results.html?year=$yearid&show=$showid&class=$classid"><?= $class ?></a></li>
                      <?php endforeach; ?>
                 </ul>
            <?php endforeach; ?>
          </ul>
        </li>
        <?php endforeach; ?>
    </ul>

However, I haven't the foggiest where to start. I considered a query within the foreach loop, but figured that may be quite inefficient?

2 Answers 2

1

You need to treat the $show as an array and just extract the part you want, something like this:

<ul>
    <?php foreach( $results as $year => $shows ): ?>
    <li><?= $year ?>
      <ul>
        <?php foreach( $shows as $show_name => $show ): ?>
        <li><?= $show_name ?>
             <ul>
                  <?php foreach( $show as $class ): ?>
                  <li><?= $class ?></li>
                  <?php endforeach; ?>
             </ul>
        </li>
        <?php endforeach; ?>
      </ul>
    </li>
    <?php endforeach; ?>
</ul>
Sign up to request clarification or add additional context in comments.

6 Comments

Spot on! For educational purposes... how does it know what $class is? As it isn't defined anywhere?
Ah, but it is defined ;) It's in the foreach loop. foreach( $show as $class ) means it takes the $show array and assigns the contents of an element to the $class variable for each element in the array.
To add to that: The loop itself defines the $class array.
Ahh I see... I may have coped but the other stackoverflow answers were either for just 2 levels, or for a nav-menu, which threw me. Thanks so much mate.
No worries. Yeah, if you have a nested array, the $value part of the foreach loop (php.net/manual/en/control-structures.foreach.php) will just become the nested array itself instead of a simple variable, which means you can use that as part of another foreach loop if desired (which is what's done here). You can nest foreach loops as much as you can nest arrays.
|
0

You should add 3rd loop:

   <ul>
    <?php foreach( $results as $year => $shows ): ?>
    <li><?= $year ?>
      <ul>
        <?php foreach( $shows as $showname=>$show_list ): ?>
             <li><ul>
             <?php foreach( $show_list as $show ): ?>
                 <li><?= $show ?></li>
             <?php endforeach; ?>
             </ul>
        <?php endforeach; ?>
      </ul>
    </li>
    <?php endforeach; ?>
</ul>

Comments

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.